2014-03-25 102 views
4

我需要插入或更新,我發現SQLiteDatabase方法insertWithOnConflict,但我不知道它是如何檢查該條目是否已經存在。使用insertWithOnConflict更新或插入

理論上我需要一個「Where」參數來檢查某個ID是否存在,如果存在,它應該替換所有其他列。

這是我現在,但我不認爲,第二個參數是唯一的ID

ContentValues args = new ContentValues(); 
    args.put(AppDatabase.COLUMN_ID, entry.getId()); 
    args.put(AppDatabase.COLUMN_NAME, entry.getAppname()); 
    args.put(AppDatabase.COLUMN_URL, entry.getAppUrl()); 
    database.insertWithOnConflict(AppDatabase.TABLE_FILELIST, COLUMN_ID, args, SQLiteDatabase.CONFLICT_REPLACE); 

如何管理這種行爲?

回答

6
  1. 確保你有你的表中的一些適當的約束,如PRIMARY KEYUNIQUE

  2. 插入時,通過ContentValues向此約束列添加值。如果插入新行將違反某些約束,則首先刪除衝突行,然後插入新行。

在你的情況,COLUMN_ID看起來像一個很好的候選人PRIMARY KEY約束。代碼中第二個參數nullColumnHack的值爲COLUMN_ID不是必需的,您可以將其作爲null傳遞給它。

+0

謝謝。我已宣佈我的COLUMN_ID爲唯一主要。如果我正確地理解了你,那麼一切都很好,並且如果主鍵重疊,數據庫將檢測到插入數據相等,對嗎? –

+0

等同於唯一列相等的意義。您可以在其他列中具有不相等的值。你可以用一個普通的'insert()'而不用'CONFLICT_REPLACE'來試試 - 你應該得到一個「column ... is not unique」消息的異常。 – laalto