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)
非常感谢任何建议,
更新
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对表进行操作时,将在其中输入重复的条目。
所以我假设以上内容可以解决您的问题。希望这个对你有帮助。
| 归档时间: |
|
| 查看次数: |
5852 次 |
| 最近记录: |