15

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

目前我正在使用它来插入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(). 也就是说,如果该值已经在该行中,它会再次插入,因此该行现在有两个相同值的值。

4

4 回答 4

18

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

由于您不想使用原始查询,您可以在插入之前实现它,只需创建一些函数来测试值是否已经在数据库中。它可以返回 boolean(或 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
}

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

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

于 2013-03-29T17:06:52.807 回答
15

您可以为插入行的冲突设置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);
}

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

于 2013-03-29T17:03:46.930 回答
3

有两种基本方法可以做到这一点:

  1. 查询数据库。手动检查数据是否已经存在,如果不存在则添加。
  2. 使用CONSTRAINTs。将您的 SQL 模式定义为仅允许此列的唯一数据。

如果您想在不同的情况下执行不同的操作(或者如果您还不精通 SQL),第一种方法更容易。第二种方法可以用更少的输入来完成,并且可以普遍应用。

于 2013-03-29T17:00:32.263 回答
3

解决方案不在 Android Api 中,而是在数据库中。如果您想确保您插入的字符串不存在于数据库中,有两种可能的解决方案。

  1. 创建数据库时,将列(您要插入的字符串)设为UNIQUE,这将防止它在该列中输入重复项。当您尝试插入并且是重复项时,它将引发错误;您可以通过异常处理来处理它。

  2. 您可以创建第二种方法(在每次插入后调用;这很昂贵)检查表中的重复项并删除它们。

I would go with approach 1.

here is a sample UNIQUE syntax

create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));

good luck

于 2013-03-29T17:09:22.110 回答