【发布时间】:2014-12-12 09:59:27
【问题描述】:
即使我在插入之前查询现有行,SQLite 也总是插入重复行。
为了避免重复插入行,我先查询了现有行
// avoid duplicate inserting request
private boolean isRowDuplicate(Avatar avatar) {
Cursor cursor = database.query(
AVATAR_TABLE_NAME,
projection,
AVATAR_COLUMN_SIGNATURE
+ "=? and " + AVATAR_COLUMN_URL + "=?",
new String[] { avatar.getSignature(), avatar.getUrl()},
null, // don't group the rows
null, // don't filter by row groups
null // The sort order
);
cursor.moveToFirst();
if (cursor.moveToNext()) {
cursor.close();
return true;
}
cursor.close();
return false;
}
那么只能插入新行
public void saveAvatars(List<Avatar> avatars) {
List<Avatar> validAvatars = Lists.newArrayList();
// query database in case insert duplicate rows
for (Avatar avatar : avatars) {
if (!isRowDuplicate(avatar)) {
validAvatars.add(avatar);
}
}
for (Avatar avatar : validAvatars) {
ContentValues values = new ContentValues();
values.put(AVATAR_COLUMN_SIGNATURE, avatar.getSignature());
values.put(AVATAR_COLUMN_URL, avatar.getUrl());
values.put(AVATAR_COLUMN_MTIME, avatar.getMtime());
/*values.put(AVATAR_COLUMN_IS_DEFAULT, (avatar.isIs_default() ? 1 : 0));*/
database.insert(AVATAR_TABLE_NAME, null, values);
}
}
但问题是当我运行应用程序时,清除所有缓存数据,我仍然可以找到插入的重复行。我对此感到困惑。
请注意,我在子线程中调用了数据库操作,所以不知道是不是多线程引起的,如何解决?
任何帮助将不胜感激。
【问题讨论】:
-
在创建数据库时,添加 UNIQUE 关键字以避免重复。见此链接:sqlite.org/lang_createindex.html
标签: android multithreading sqlite