2010-03-04 52 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(); 
相關問題