如果已存在相同的ID,则更新/替换行

时间:2015-08-22 23:37:54

标签: android sqlite

我有以下方法在我的sqlite数据库中插入值。我试图更新代码以处理" carid"和" sellerno"已存在于表中,如果它们替换为要插入的新值。任何帮助表示赞赏。

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

2 个答案:

答案 0 :(得分:1)

有两个要求:

  1. SQLite需要知道caridsellerno的组合对于表格中的所有行必须是唯一的。
  2. SQLite需要知道当插入或更新导致冲突时要执行的操作(多个行具有相同的列组合值)。
  3. 您可以通过修改CREATE TABLE命令来同时执行这两项操作:

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

    现在,当插入/更新产生冲突时,任何插入/更新都将自动替换现有行中的值。

    但是,在发生冲突时,您可能不希望替换行中的值。在这些情况下,您应该在插入/更新本身中指定冲突算法(使用thisthis),这将覆盖上面指定的替换算法。或者,您可以不使用上面的ON CONFLICT REPLACE,只使用常规插入/更新,但是当您要替换时必须插入/更新冲突。

    您可以阅读有关冲突算法here的更多信息。

答案 1 :(得分:0)

更新代码与您现在的非常相似。

您必须添加新值但需要相同的ID,然后使用insert(...)replace(...)而不是方法update(...)

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

另一种方式是:

db.replace(TABLE_CARS, null, values);

您的其余代码是相同的。只需更改insert行。