【问题标题】:Insert if not exists?如果不存在则插入?
【发布时间】:2011-04-12 15:49:55
【问题描述】:

我正在提示用户将项目添加到 SQLiteDb。当他们点击添加时,我想检查该项目是否已经存在......如果不存在,那么我想插入它。

我打电话

mDbHelper.createNote(inputLine.getText().toString().trim(), mTable[i]);

调用...

public long createNote(String value, String table) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(table, value);

        return mDb.insert(table, null, initialValues);
    }

这是可行的,但它不会检查项目是否已经存在,所以它仍然会插入重复项。所以我尝试了

return mDb.insertWithOnConflict(table, null, initialValues, SQLiteDatabase.CONFLICT_FAIL);

但是,它似乎无法识别 insertWIthOnConflict 或 SQLiteDatabase.CONFLICT_FAIL...

我怎样才能让它工作?

编辑:它是 1 个表,2 行。表名 = 注释,行 = _id,注释。

【问题讨论】:

标签: java android sqlite


【解决方案1】:

使用REPLACE 命令

【讨论】:

  • 这似乎与插入完全一样。我仍然可以多次插入同一个项目。
  • 如果这是真的,你没有正确定义主键
【解决方案2】:

在这种情况下,我会进行这样的检查:

if (!checkRecordExist(DATABASE_TABLE, new String[] {KEY_1, KEY_2}, new String[] {value_1, value_2})) 
database.insert(DATABASE_TABLE, null, updateValues);

在哪里

private boolean checkRecordExist(String tableName, String[] keys, String [] values) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < keys.length; i++) {
        sb.append(keys[i])
            .append("=\"")
            .append(values[i])
            .append("\" ");
        if (i<keys.length-1) sb.append("AND ");
    }

    Cursor cursor = database.query(tableName, null, sb.toString(), null, null, null, null);
    boolean exists = (cursor.getCount() > 0);
    cursor.close();
    return exists;
}

【讨论】:

  • 当您有多个用户检查一条记录是否同时存在时会发生什么?
  • 我有本地数据库,所以一次只能完成一个请求。如果发现重复,您可以对记录添加进行检查并返回警告。
  • -1 虽然这行得通,但这是一种非常糟糕的做法,应该避免使用,可以使用INSERT OR IGNORE 找到更好的解决方案。 How to do IF NOT EXISTS in SQLite
【解决方案3】:

添加主键。如果您尝试使用相同的键插入另一行,则插入将失败。

【讨论】:

  • 我如何确定另一行是否有相同的键?在插入记录之前不会生成密钥。
【解决方案4】:

您是否尝试过使用未设置为自动递增的主键?这可能是 REPLACE 命令不起作用的原因

【讨论】:

  • 你的意思是不是有 2 列,_id,注意。我应该摆脱 _id 并设置注释文本主键?
  • 我的意思是,如果您愿意自己生成主键,那么您不需要使用自动增量,您的 REPLACE 可能会起作用。请注意,对于您在上面接受的答案,您正在为每个插入(检查和实际插入)进行两次数据库调用,因此它会减慢您在数据库中的时间。它还有一个 TOCTOU 问题,因为它不是原子的,因此如果您针对它运行多个线程,请确保正确同步
猜你喜欢
  • 2018-09-17
  • 2014-06-11
  • 2017-04-24
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多