0

重複の可能性:
データベース テーブルのデータを取得し、存在しない場合は挿入し、そうでない場合は行 ID を返します

データベーステーブルにデータが存在する場合はフェッチしようとします。はいの場合は行IDを取得する必要があります。それ以外の場合は、このコードをテーブルに挿入します

public int finddate(String date){
    int id=0;
    AndroidOpenDbHelper androidOpenDbHelperObj = new AndroidOpenDbHelper(this);
    SQLiteDatabase sqliteDatabase = androidOpenDbHelperObj.getWritableDatabase();
    Cursor cursor = sqliteDatabase.rawQuery("SELECT _id FROM " + 
                            AndroidOpenDbHelper.TABLE_DATE + " where " +
                            AndroidOpenDbHelper.COLUMN_NAME_DATE + " = " + date,
                            null);
    startManagingCursor(cursor);
    if (cursor != null) { 
        if( cursor.moveToFirst() ) {
            id = cursor.getInt(cursor.getColumnIndex("_id"));
        }
    } else { 
        id=0;
    }
    sqliteDatabase.close(); 
    return id;          
}

既存のアイテムを試してみると、このメソッドの結果 =0 が返され、アイテムがテーブルに挿入されました。これを行うにはどうすればよいですか?

4

2 に答える 2

0

クエリは次のようになります。

Cursor cursor = sqliteDatabase.rawQuery("SELECT _id FROM " + AndroidOpenDbHelper.TABLE_DATE + " where "+ AndroidOpenDbHelper.COLUMN_NAME_DATE+ " =\'"+date+"\'", null);
startManagingCursor(cursor);
cursor.moveTofirst();

if (cursor.getCount() > 0) { 

        id = cursor.getInt(cursor.getColumnIndex("_id"));
    }
} else { 
    id=0;
}
于 2012-06-15T10:26:23.607 に答える
0

dateが正しくエスケープされていません。これを解決する最も安全でクリーンな方法は、日付値をクエリに埋め込むのではなく、パラメーターとして渡すことです。

カーソル管理をかなり整理することもできます。nullクエリが失敗すると例外がスローされるため、カーソルをチェックする必要はありません。また、最初から設定しているので設定する必要はありませんid = 0。これははるかに簡単です:

Cursor cursor = sqliteDatabase.rawQuery("SELECT _id FROM " + 
                        AndroidOpenDbHelper.TABLE_DATE + " where " +
                        AndroidOpenDbHelper.COLUMN_NAME_DATE + " = ?",
                        new String[] { date } );

if ( cursor.moveToFirst() ) {
    id = cursor.getInt(cursor.getColumnIndex("_id"));
}

cursor.close();
sqliteDatabase.close(); 
于 2012-06-15T10:29:08.047 に答える