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

时间:2013-03-29 16:57:06

标签: java android android-sqlite sql-insert

我知道有一个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);
}

dbSQLiteDatabase的实例。)

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

4 个答案:

答案 0 :(得分:15)

  

SQLiteDatabase:仅在值不存在时插入(不通过raw   SQL命令)

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

一个小例子:

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
}
  

如果该值已经在行中,则会再次插入,以便现在显示该行   有两个相同值的值。

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:3)

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

  1. 查询数据库。手动检查数据是否已存在,如果不存在,则添加数据。
  2. 使用CONSTRAINTs。将SQL架构定义为仅允许此列的唯一数据。
  3. 如果您想在不同情况下执行不同的操作(或者您还不熟练使用SQL),第一种方法会更容易。第二种方法可以通过更少的输入完成,并且可以普遍应用。

答案 3 :(得分:3)

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

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

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

  3. 我会选择方法1.

    这是一个示例UNIQUE语法

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

    祝你好运