在冲突替换上创建唯一约束

ant*_*009 5 sqlite android

Android Studio 0.8.11
Run Code Online (Sandbox Code Playgroud)

你好,

我在FEED_NUMBER列上有以下唯一约束.因此,当我获得需要插入的新记录时,我将只用相同的FEED_NUMBER替换记录.但是,当插入运行时,它总是添加新记录并忽略约束.我在这做错了吗?

这是我的onCreate:

public void onCreate(SQLiteDatabase db) {
         String sql = "create table " + FottContract.TABLE
                + "(" + FottContract.Column.ID + " integer primary key autoincrement, "
                 + FottContract.Column.FEED_NUMBER + " text, "
                 + FottContract.Column.TITLE + " text, "
                 + FottContract.Column.DESCRIPTION + " text, "
                 + FottContract.Column.IMAGE + " text, "
                 + "unique (" + FottContract.Column.FEED_NUMBER + ") on conflict replace" + ")";

        db.execSQL(sql);
    }
Run Code Online (Sandbox Code Playgroud)

这就是我插入的方式:

 private void saveToSQLite() {
        ContentValues contentValues = new ContentValues();

        /* For each item in the memory database insert into sqlite */
        for (int i = 0; i < mNewsFeedDB.size(); i++) {
            contentValues.put(FottContract.Column.FEED_NUMBER, mNewsFeedDB.get(i).getId());
            contentValues.put(FottContract.Column.TITLE, mNewsFeedDB.get(i).getTitle());
            contentValues.put(FottContract.Column.DESCRIPTION, mNewsFeedDB.get(i).getDescription());
            contentValues.put(FottContract.Column.IMAGE, mNewsFeedDB.get(i).getImage());

            /* Insert it */
            long row = mDb.insert(FottContract.TABLE, null, contentValues);
        }
    }
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议,

Sho*_*uri 1

更新

mDb.insert(..)您是否尝试过使用insertWithConflict函数?就像是:

/* Insert it*/
mDb.insertWithOnConflict(FottContract.TABLE, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
Run Code Online (Sandbox Code Playgroud)

之前的想法

(正如 @corsair992 在评论中指出的那样,我认为他说删除后触发触发器是正确的。)

代码看起来没问题,但可能存在以下问题:

可能的问题:

  • 您使用的是版本3.6.18或更高版本吗?我想自从它于 2009 年发布以来您就会如此。如果您看到SQL lite 版本 3.6.18 的发行说明,它会说:

    当由于 REPLACE 冲突解决而删除行时,删除触发器会触发。该功能仅在启用递归触发器时启用。

  • 如果您阅读冲突条款REPLACE页面上的 详细信息,就会提到类似的事情:

    ...当 REPLACE 冲突解决策略删除行以满足约束时,当且仅当启用了递归触发器时,删除触发器才会触发

可能的解决方案:

可能是recursive_triggers残疾人。您可以通过运行以下 SQL 查询来启用递归触发器:

PRAGMA recursive_triggers='ON'
Run Code Online (Sandbox Code Playgroud)

您可以使用在给定问题的片段中使用的相同execSQL方法在代码中执行查询。在 REPLACE 博客上查看SQLite fire DELETE 触发器以了解更多信息。写博客的人提到他的团队也有类似的问题。当他们REPLACE对表进行操作时,将在其中输入重复的条目。

所以我假设以上内容可以解决您的问题。希望这个对你有帮助。