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 回答