我期待以最快和最正确的方式检查数据库中是否存在记录:
public boolean Exists(String _id) {
Cursor c=db.query(TABLENAME(), new String[] {"1"}, "_ID="+_id, null, null, null, null);
if (!c.equals(null))
return c.moveToFirst();
return false;
}
Run Code Online (Sandbox Code Playgroud)
你觉得它有什么问题吗?
tbr*_*lle 42
认为那mDb
是你的SqlLiteDatabase
班级
public boolean Exists(String _id) {
Cursor cursor = mDb.rawQuery("select 1 from yourTable where _id=%s",
new String[] { _id });
boolean exists = (cursor.getCount() > 0);
cursor.close();
return exists;
}
Run Code Online (Sandbox Code Playgroud)
_id
,String
但我认为它应该是一个Long
.select 1
更快,select columnName
因为进程不需要从select子句中的表中检索所有值.select 1 from...
放在一个静态的最终常量中,以便更快.这个问题和选定的答案对我有助于理解如何简单快速地检查记录是否退出.但是,rawQuery
由于SQL注入的可能性,我已经看到许多建议不使用的地方.(例如,rawQuery Vs. database.query)
所以这就是我决定的:
public boolean Exists(String searchItem) {
String[] columns = { COLUMN_NAME };
String selection = COLUMN_NAME + " =?";
String[] selectionArgs = { searchItem };
String limit = "1";
Cursor cursor = db.query(TABLE_NAME, columns, selection, selectionArgs, null, null, null, limit);
boolean exists = (cursor.getCount() > 0);
cursor.close();
return exists;
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否和所选答案一样快,但在研究之后,它似乎更符合推荐的Android约定.
更新
我现在推荐@ yuku的答案,但我不会删除我的,因为我仍然想引导人们远离使用原始查询.
由于您正在寻找“可信和/或官方来源”的答案,因此DatabaseUtils
我们这里有一种称为的方法queryNumEntries
。
因此,您的方法可以如下所示:
public boolean Exists(String _id) {
return DatabaseUtils.queryNumEntries(db, TABLENAME(), "_ID=?", new String[] {"1"}) > 0;
}
Run Code Online (Sandbox Code Playgroud)
或者,对于更快的一种:
public boolean Exists(String _id) {
return DatabaseUtils.longForQuery(db, "select count(*) from " + TABLENAME() + " where _ID=? limit 1", new String[] {"1"}) > 0;
}
Run Code Online (Sandbox Code Playgroud)