我正在寻找检查数据库中是否存在记录的最快和最正确的方法:
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;
}
你觉得它有什么问题吗?
答案 0 :(得分: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;
}
_id
保留为String
,但我认为它应该是Long
。select 1
比select columnName
更快,因为该过程不需要从select子句中的表中检索所有值。select 1 from...
放在静态最终常量中,以便更快。答案 1 :(得分:5)
这个问题和选定的答案对我有助于理解如何简单快速地检查记录是否退出。但是,由于SQL注入的可能性,我已经看到许多建议不要使用rawQuery
的地方。 (例如,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;
}
我不知道这是否与所选答案一样快,但在研究完之后,它似乎更符合推荐的Android惯例。
<强>更新强>
我现在推荐@ yuku的答案,但我还是不能删除我的,因为我仍然想引导人们远离使用原始查询。
答案 2 :(得分:5)
由于您正在寻找“可靠和/或官方来源”的答案,因此在DatabaseUtils
中我们有一个名为queryNumEntries
的方法。
所以你的方法可以这样做:
public boolean Exists(String _id) {
return DatabaseUtils.queryNumEntries(db, TABLENAME(), "_ID=?", new String[] {"1"}) > 0;
}
或者,对于更快的一个:
public boolean Exists(String _id) {
return DatabaseUtils.longForQuery(db, "select count(*) from " + TABLENAME() + " where _ID=? limit 1", new String[] {"1"}) > 0;
}
答案 3 :(得分:1)
试试这个:
在您的DatabaseHelper中,放置此方法......
public String Exist(String user) {
String username="";
SQLiteDatabase db = this.getReadableDatabase();
try {
Cursor c = db.query(TABLE_USER, null, KEY_USER + "=?", new String[]{String.valueOf(user)},null, null, null);
if (c == null) {
return username;
}
else {
c.moveToFirst();
username = c.getString(c.getColumnIndex(KEY_USER));
}
}
catch(Exception e){
e.printStackTrace();
}
return username;
}
然后在你的onClickListener中,尝试调用你在DatabaseHelper中创建的方法。试试这段代码:
String myUser = txtUser.getText().toString();
String storedUser = db.Exist(myUser);
//If Username exist
if (myUser.equals(storedUser)){
Toast.makeText(getApplicationContext(), "Username already exist!", Toast.LENGTH_SHORT).show();
答案 4 :(得分:0)
这很好用:
Cursor cursor = null;
String sql ="SELECT * FROM "+TableName+" WHERE ID="+idValue;
cursor= db.rawQuery(sql,null);
Log.d("ISEXISTS","Cursor Count : " + cursor.getCount());
boolean exists = (cursor.getCount() > 0);
cursor.close();