Android记录存在于数据库中?

Pen*_*m10 23 java android

我期待以最快和最正确的方式检查数据库中是否存在记录:

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...放在一个静态的最终常量中,以便更快.

  • 您还应该在返回值之前关闭光标.它不会导致崩溃,但确实会发出警告. (4认同)

Sur*_*gch 5

这个问题和选定的答案对我有助于理解如何简单快速地检查记录是否退出.但是,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的答案,但我不会删除我的,因为我仍然想引导人们远离使用原始查询.


Ran*_*ku' 5

由于您正在寻找“可信和/或官方来源”的答案,因此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)