2010-03-04 48 views
23

我期待的最快和正确的方法,以检查是否存在于数据库中的记录: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; 
} 

你看到它的任何问题?

+0

结帐我的答案在这里: http://stackoverflow.com/questions/27597922/android-sqlite-check-if-row-exists-in-table/43849296#43849296 – 2017-05-08 13:51:07

回答

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; 
} 
  • 类我把你的参数_idString,但我认为它应该是一个Long
  • select 1select columnName更快,因为该过程不需要从select子句中的表中检索所有值。
  • 你可以把字符串select 1 from...放在一个静态的最终常量中,以便更快。
+0

ARF你必须改变你的问题,而我回答。 .. – tbruyelle 2010-03-04 13:49:54

+4

你应该在返回一个值之前关闭游标。它不会导致崩溃,但确实会发出警告。 – 2010-03-04 17:46:00

+0

是的你是对的,我已经更新了我的答案 – tbruyelle 2010-03-05 13:38:34

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(); 
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; 
} 

我不知道这是快如选择的答案或没有,但研究此之后,似乎符合推荐Android的公约更多。

更新

我现在建议@欲哭的答案,但我不会删除我的还没有,因为我还是想引导人们远离使用原始查询。

4

既然您正在寻找来自'可靠和/或官方消息'的答案,在这里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; 
} 
+0

这是回答我一直在寻找,当我做赏金的那种。我不知道这些DatabaseUtils前的。如果你不介意的话,能你简单解释为什么longForQuery更快?文档有点稀疏 – Suragch 2015-03-04 14:37:15

+0

我想这是因为LIMIT 1子句更快,所以阻止它计算行数if您有多个满足选择条件的行。但是,由于您的标准是_ID,可以假定它是唯一的特定表,那么它们应该具有相同的速度。 – yuku 2015-03-05 01:39:12

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(); 
相关问题