SQLiteDatabase:仅当值不存在时才插入(不通过原始 SQL 命令)

2022-09-03 09:19:33

我知道有一个SQL命令是这样的:,但是由于Android的类有一些很好的方法,我想知道如果通过方法不存在,是否可以插入一个值。IF NOT EXISTSSQLiteDatabase

目前,我正在使用它来插入:String

public long insertString(String key, String value) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(key, value);
    return db.insert(DATABASE_TABLE, null, initialValues);
}

(db是 的实例。SQLiteDatabase

我尝试了该方法而不是,但似乎它与 相同。也就是说,如果该值已在行中,则会再次插入该值,因此该行现在具有两个相同值的值。insertOrThrow()insert()insert()


答案 1

SQLiteDatabase:仅当值不存在时才插入(不通过原始 SQL 命令)

由于您不想使用原始查询,因此您可以在插入之前实现它,只需创建一些函数来测试值是否已经在数据库中。它可以返回布尔值(或int),如果它返回false,您将执行插入查询。

举个小例子:

public int getCount() {
    Cursor c = null;
    try {
        db = Dbhelper.getReadableDatabase();
        String query = "select count(*) from TableName where name = ?";
        c = db.rawQuery(query, new String[] {name});
        if (c.moveToFirst()) {
            return c.getInt(0);
        }
        return 0;
    }
    finally {
        if (c != null) {
            c.close();
        }
        if (db != null) {
            db.close();
        }
    }
}

if (getCount() == 0) {
   //perform inserting
}

如果该值已在行中,则会再次插入该值,因此该行现在具有两个相同值的值。

这可以通过使用适当的约束来解决,该约束不允许插入重复项。检查这个:


答案 2

您可以为插入行的冲突设置CONFLICT_IGNORE行为:

public long insertString(String key, String value) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(key, value);
    return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
}

但这取决于约束。如果您将来需要,还会有更多行为。


推荐