【问题标题】:Using insertWithOnConflict for update or insert使用 insertWithOnConflict 进行更新或插入
【发布时间】:2014-05-03 21:11:56
【问题描述】:

我需要插入或更新,我找到了SQLiteDatabase的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);

我该如何管理这种行为?

【问题讨论】:

    标签: android sqlite where-clause insert-update


    【解决方案1】:
    1. 确保您的表中有一些适当的约束,例如PRIMARY KEYUNIQUE

    2. 插入时,通过ContentValues 向此受约束的列添加一个值。如果插入新行会违反某些约束,则首先删除冲突的行,然后插入新行。

    在您的情况下,COLUMN_ID 看起来是 PRIMARY KEY 约束的良好候选者。代码中第二个参数nullColumnHack 的值为COLUMN_ID 不是必需的,您可以将其传递为null

    【讨论】:

    • 谢谢。我已将我的 COLUMN_ID 声明为唯一的主节点。如果我理解正确,那么一切都很好,如果主键重叠,数据库将检测插入数据是否相等,对吗?
    • 在唯一列相等的意义上相等。您可以在其他列中具有不相等的值。您可以使用没有CONFLICT_REPLACE 的普通insert() 进行尝试 - 您应该会收到“列...不是唯一”消息的异常。
    猜你喜欢
    • 2012-10-04
    • 2014-01-15
    • 1970-01-01
    • 2012-06-16
    • 2018-05-17
    • 2021-12-14
    • 2014-04-02
    • 2014-08-08
    • 2014-07-10
    相关资源
    最近更新 更多