【问题标题】:how to avoid duplicate insert to SQLite如何避免重复插入到 SQLite
【发布时间】: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);
    }
}

但问题是当我运行应用程序时,清除所有缓存数据,我仍然可以找到插入的重复行。我对此感到困惑。

请注意,我在子线程中调用了数据库操作,所以不知道是不是多线程引起的,如何解决?

任何帮助将不胜感激。

【问题讨论】:

标签: android multithreading sqlite


【解决方案1】:

moveToFirst() 转到第一条记录(如果存在)。 随后的moveToNext() 调用会转到第二条记录(如果存在)。

您必须检查moveToFirst() 调用的返回值。

您可以直接计算行数,而不是摆弄光标:

long count = DatabaseUtils.queryNumEntries(
                    database,
                    AVATAR_TABLE_NAME,
                    AVATAR_COLUMN_SIGNATURE + "=? and " +
                    AVATAR_COLUMN_URL + "=?",
                    new String[] { avatar.getSignature(), avatar.getUrl()});
return count > 0;

【讨论】:

  • 但我仍然不知道如何解决我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2019-10-15
  • 1970-01-01
相关资源
最近更新 更多