2011-04-12 86 views
0

我在提示用戶添加一個項目到SQLiteDb。當他們點擊添加,我想檢查,如果該項目已經存在...如果它不,那麼我想插入它。如果不存在,插入?

我打這個電話

mDbHelper.createNote(inputLine.getText().toString().trim(), mTable[i]); 

其中要求...

public long createNote(String value, String table) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(table, value); 

     return mDb.insert(table, null, initialValues); 
    } 

那是工作,但它不檢查,如果該項目已經存在,所以它仍然插入重複。所以,我想

return mDb.insertWithOnConflict(table, null, initialValues, SQLiteDatabase.CONFLICT_FAIL); 

但是,它似乎並沒有認識insertWIthOnConflict或SQLiteDatabase.CONFLICT_FAIL ...

我怎樣才能得到這個工作?

編輯:它是1表,2行。表名= note,rows = _id,note。

+2

您是否將_id列聲明爲主鍵? – 2011-04-12 15:55:31

+0

是的,主鍵自動增量 – Roger 2011-04-12 15:58:57

+0

更多**更好的方法來做到這一點詳細[在SQLite中如何做IF NOT EXISTS](http://stackoverflow.com/q/531035/808940) – Merlin 2011-07-31 16:56:43

回答

1

在這種情況下,我會藉此這樣的檢查:

if (!checkRecordExist(DATABASE_TABLE, new String[] {KEY_1, KEY_2}, new String[] {value_1, value_2})) 
database.insert(DATABASE_TABLE, null, updateValues); 

其中

private boolean checkRecordExist(String tableName, String[] keys, String [] values) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < keys.length; i++) { 
     sb.append(keys[i]) 
      .append("=\"") 
      .append(values[i]) 
      .append("\" "); 
     if (i<keys.length-1) sb.append("AND "); 
    } 

    Cursor cursor = database.query(tableName, null, sb.toString(), null, null, null, null); 
    boolean exists = (cursor.getCount() > 0); 
    cursor.close(); 
    return exists; 
} 
+0

當你有多個用戶檢查一個記錄是否同時存在? – Davidann 2011-04-12 16:01:21

+0

我有本地數據庫,所以在一次只能完成一個請求。如果發現dublicate,您可以在記錄添加和返回警告時執行該檢查。 – 2011-04-12 16:08:40

+0

工作,謝謝! – Roger 2011-04-12 16:57:55

2

使用REPLACE命令

+0

這似乎功能完全像插入。我可以多次插入相同的物品。 – Roger 2011-04-12 16:04:29

+0

如果這是真的,你沒有正確定義一個主鍵 – codymanix 2011-05-04 15:50:02

0

添加主鍵。如果您嘗試使用相同的鍵插入另一行,則插入操作將失敗。

+1

如何找出另一行是否有相同的密鑰?在插入記錄之前不會生成密鑰。 – Roger 2011-04-12 16:03:55

0

您是否嘗試過使用未設置爲自動增量的主鍵?這可能是REPLACE命令不起作用的原因

+0

你的意思是代替2列_id,注意。我應該擺脫_id並設置註釋文本主鍵? – Roger 2011-04-12 16:40:06

+0

我的意思是,如果你願意自己生成主鍵,那麼你不需要使用自動增量,然後你的REPLACE就可以工作。請注意,對於上面接受的答案,您將爲每個插入操作(檢查和實際插入)執行兩次數據庫調用,因此它會減慢數據庫中的時間。它還有一個TOCTOU問題,因爲它不是原子的,所以如果你對它運行多線程,請確保你正確地同步 – 2011-04-12 17:18:05