2015-08-22 73 views
0

我有下面的方法,在我的sqlite數據庫中插入值。我試圖更新代碼來處理表中已經存在「carid」和「sellerno」的情況,以及它們是否替換插入的新值。任何幫助表示讚賞。更新/替換行,如果相同的ID已經存在

public void addListItem(String carid,String sellerno,String condition,String dat) { 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(carid, carid); 
    values.put(sellerno, sellerno); 
    values.put(cond, condition); 
    values.put(updatetime, dat); 
    db.insert(TABLE_CARS, null, values); 
    db.close(); 
} 
+0

還有一些更長的討論在這裏:http://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace – eckes

+0

當你創建你的表時可以設置un衝突更新或替換。作爲karakury xplain的答案。 –

回答

1

有兩個要求:

  1. 的SQLite需要知道的caridsellerno組合必須在表中的所有行是唯一的。
  2. SQLite需要知道當插入或更新導致衝突時該做什麼(對於那些列有多個具有相同值組合的行)。

您可以通過修改你的CREATE TABLE命令如下同時做這兩:

CREATE TABLE tableName (
    column1 ..., 
    column2 ..., 
    ..., 
    UNIQUE(column1, column2) ON CONFLICT REPLACE) 

現在,任何插入/更新將自動替換現有行的值時,插入/更新將創建一個衝突。

但是,有些情況下您不希望在衝突時替換行中的值。在這些情況下,您應該在插入/更新本身中指定衝突算法(使用thisthis),這將覆蓋上面指定的替換算法。或者,您可以不使用上面的ON CONFLICT REPLACE,只使用常規插入/更新,但是當您要替換時,您必須插入/更新衝突。

你可以閱讀更多關於衝突算法here

+0

我成功替換原始的..但我不想改變它的原始ID(在創建表中自動增量)。那我該怎麼辦? –

+0

@VishalJadav然後你需要做一個更新。如果您不知道是否存在現有的行,並且想要執行_either_插入或基於此更新,則必須以不同的方式實施。 – Karakuri

+0

好的。得到它了。感謝您的回覆。 @Karakuri –

0

更新代碼與您現在擁有的非常相似。

您必須添加新值,但需要使用相同的ID,然後使用replace(...)update(...)代替方法insert(...)

db.update(TABLE_CARS, values, "_id "+"="+1, null); 
// The third argument above is the where clause. 

另一種方法是:

db.replace(TABLE_CARS, null, values); 

你的代碼的其餘部分是相同的。只需更改insert一行。

相關問題