【问题标题】:SQLiteDatabase: Insert only if the value does not exist (not via raw SQL command)SQLiteDatabase:仅当值不存在时才插入(不是通过原始 SQL 命令)
【发布时间】:2013-03-29 16:57:05
【问题描述】:

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

【问题讨论】:

标签: java android android-sqlite sql-insert


【解决方案1】:

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
}

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

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

【讨论】:

  • 如何推荐使用约束而不是遵循您发布的关于插入前检查的代码?我正在测试约束,我注意到一个堆栈跟踪被打印到控制台关于由于约束而无法插入,这会影响什么吗?应用程序没有崩溃,也没有注意到性能下降,只是想知道。
  • 在我的情况下,我必须插入数千行,并且为每一行执行单独的查询看起来不是一个明智的解决方案。
【解决方案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);
}

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      我会采用方法 1。

      这是一个示例 UNIQUE 语法

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

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-21
        • 2013-04-28
        • 1970-01-01
        相关资源
        最近更新 更多