【问题标题】:Inserting data to SQLite table with constraint failure在约束失败的情况下将数据插入 SQLite 表
【发布时间】:2013-12-31 04:46:15
【问题描述】:

在约束失败的情况下将数据插入 SQLite 表

我正在尝试将数据插入 Android 上的 SQLite 表中。 _id 是表的主键,我正在使用这种方法插入一行:

public void addSomeData(int id, String datetime) {
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_ID, id);
    contentValues.put(KEY_DATETIME, datetime);
    mDb.insert(TABLE, null, contentValues);
}

我遇到的问题是,有时会验证主键约束,我想使用类似INSERT IF NOT EXISTS 的东西,但最好是可以与ContentValues 一起使用的东西。我有哪些选择?我知道insertOrThrow()insertWithOnConflict() 方法只返回不同的值,或者我应该使用其中一种方法吗?

【问题讨论】:

    标签: android sqlite constraints


    【解决方案1】:

    insertWithOnConflict()CONFLICT_IGNORE 一起使用。

    将返回新行或现有行的 ROWID/主键,任何错误为 -1。

    【讨论】:

      【解决方案2】:

      在我的情况下,发生“约束失败”是因为我有一些相互依赖的表。至于“如果不存在则插入”,您可以使用此id查询并检查游标的计数是否大于零。检查我已经在我的应用中使用的方法。

      public boolean isRowExists(long rowId) {
      
          Cursor cursor = database.query(this.tableName, this.columns, DBSQLiteHelper.COLUMN_ID + " = ? ", new String[] { "" + rowId }, null, null, null);
      
          int numOfRows = cursor.getCount();
          cursor.close();
      
          return (numOfRows > 0) ? true : false;
      }
      

      【讨论】:

      • @REACHUS 这就是你要找的。我是在为你寻找答案的时候才看到的。我也会更新我的一些大型查询。 stackoverflow.com/a/4330694/1080954
      • 谢谢。如果我在表中设置了primary key,我应该如何执行 INSERT/UPDATE?
      • @REACHUS 你查看我刚刚评论的链接了吗?答案就在那里。也检查这个链接。这也可能有帮助。 stackoverflow.com/a/690665/1080954
      【解决方案3】:

      为此,您可以简单地查询数据库以查看是否存在具有该键的行,并仅在查询未返回数据时插入新行。

      【讨论】:

      • 我知道,但我插入了很多行,这样效率不高。
      • @REACHUS 这正是数据库为检查每条记录的约束所做的工作(检查后,该记录在缓存中)。
      • 按照其他答案之一的建议使用insertWithOnConflict() 怎么样?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多