2017-04-05 16 views
0

こんにちは私のデータベースを調べて、特定の文字列がこの場合は列のタイトルが存在するかどうかを確認しようとしています。私はその行からすべての情報を取得し、いくつかの追加の検証のために使用することができます。特定の文字列のSQLデータベースを検索し、その文字列が存在する行IDを返す

私はgetAppointment IDメソッドでこれを試みましたが、カーソルインデックスエラー-1を取得し続けます。私はIDを返すことができると、私は行を取得し、正しい予定のインスタンスを返すためにそれを使用する予定です。私はSQLに非常に慣れていて、どんなヘルパーも高く評価されます。

public class MyDataBase extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "appointments.db"; 
public static final String TABLE_APPOINTMENTS = "appointments"; 
public static final String _ID = "id"; 
public static final String COLUMN_DAY = "day"; 
public static final String COLUMN_MONTH = "month"; 
public static final String COLUMN_YEAR = "year"; 
public static final String COLUMN_TITLE = "title"; 
public static final String COLUMN_TIME = "time"; 
public static final String COLUMN_DESCRIPTION = "details"; 


public MyDataBase(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String query = "CREATE TABLE " + TABLE_APPOINTMENTS 
      + "(" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_DAY + " INTEGER, " + COLUMN_MONTH + " INTEGER, " + COLUMN_YEAR + " INTEGER, " 
      + COLUMN_TITLE + " TEXT, " + COLUMN_TIME + " TEXT, " + COLUMN_DESCRIPTION + " TEXT" + ")"; 
    db.execSQL(query); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_APPOINTMENTS); 
    onCreate(db); 
} 

public int getAppointmentID(String name){ 
    SQLiteDatabase db = getReadableDatabase(); 
    int i=0; 

    String selection = COLUMN_TITLE + " = ? "; 
    String[] selectionArgs = new String[]{name}; 
    Cursor cursor = db.query(TABLE_APPOINTMENTS, null, selection, selectionArgs, null, null, null); 

    if (cursor != null) { 
     cursor.moveToFirst(); 
     if(cursor.moveToNext()) 
      i = cursor.getInt(0); 
    } 
    cursor.close(); 
    return i; 
} 


public void addAppointment(Appointment app){ 
    SQLiteDatabase db = getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(COLUMN_DAY, app.get_day()); 
    values.put(COLUMN_MONTH, app.get_month()); 
    values.put(COLUMN_YEAR, app.get_year()); 
    values.put(COLUMN_TITLE, app.get_title()); // need to check that string being entered isn't already a unique entry 
    values.put(COLUMN_TIME, app.get_time()); 
    values.put(COLUMN_DESCRIPTION, app.get_details()); 
    db.insert(TABLE_APPOINTMENTS, null, values); 
    db.close(); 
} 

public Appointment getAppointment(int a){ 
    String selectQuery = "SELECT * FROM " + TABLE_APPOINTMENTS + " WHERE id 
= " + Integer.toString(a); 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c = db.rawQuery(selectQuery, null); 
    Appointment app = new Appointment(); 

    if(c.moveToFirst()){ 
      app.set_day(Integer.parseInt(c.getString(1))); 
      app.set_month(Integer.parseInt(c.getString(2))); 
      app.set_year(Integer.parseInt(c.getString(3))); 
      app.set_title(c.getString(4)); 
      app.set_time(c.getString(5)); 
      app.set_details(c.getString(6)); 
    } 
    return app; 
}  

} 
+0

は私の答えをチェックしてください。 – tahsinRupam

答えて

0

は、以下のようなあなたのgetAppointmentID()方法を変更します。

public int getAppointmentID(String name){ 
    SQLiteDatabase db = getReadableDatabase(); 
    int i=0; 
    String[] projection = {_ID}; 
    String selection = COLUMN_TITLE + " = ? "; 
    String[] selectionArgs = new String[]{name}; 
    Cursor cursor = db.query(TABLE_APPOINTMENTS, projection, selection, selectionArgs, null, null, null); 

    if (cursor != null) { 
     cursor.moveToFirst();      
    } 

    i = cursor.getInt(0); 
    cursor.close(); 
    db.close(); 

    return i; 
} 
+1

それは多くのおかげで、あなたがした変更を説明してもらえますか?私はこの分野の知識を向上させたいと思っています。 – Spoingen

+0

出力として行が1つしかなくても、カーソルを 'moveToNext() 'に移動していました。あなたはまた、出力列に 'NULL'値を入れていました。そして、作業終了後に 'db'を閉じるか、メモリリークに直面することができます。 – tahsinRupam

+0

ご協力いただきありがとうございます。 – Spoingen

関連する問題