Android:SQLite – insertWithOnConflict

我正在调用insertWithOnConflict,使用SQLiteDatabase.CONFLICT_IGNORE。 但是,如果发生冲突,则返回“-1”而不是现有行的ID。 我该如何纠正?

表格创build:

编辑:

String CREATE_CATEGORY_TABLE = "CREATE TABLE "+TABLE_CATEGORY+"(" + BaseColumns._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ KEY_CATEGORY_NAME+" TEXT UNIQUE" + ")"; db.execSQL(CREATE_CATEGORY_TABLE); 

插入语句:

 ContentValues values = new ContentValues(); values.put(KEY_CATEGORY_NAME, name); int catID = (int) db.insertWithOnConflict(TABLE_CATEGORY, null, values, SQLiteDatabase.CONFLICT_IGNORE); 

  • Android中删除表中所有行的最佳方法是什么
  • 使用LIKE运算符的Android大小写不敏感游标查询(适用于所有语言环境)
  • 如何在SD卡中创建私人文件夹
  • android sqlite双向同步sqlite
  • Android持久性空间:“无法弄清楚如何从光标读取此字段”
  • 如何通过ORDER构建一个SQLite查询到GROUP?
  • 有关在SQLite数据库中使用Android备份服务的问题
  • 在Android ContentProvider中连接表和通知ContentObserver的最佳实践
  • insertWithOnConflict,使用SQLiteDatabase.CONFLICT_IGNORE不能按预期工作,应该可能完全避免,根据这个问题:
    https://code.google.com/p/android/issues/detail?id=13045

    Android期望主键列被称为_id 。 可能是原因:由于列不存在,它不能返回值并返回-1。

    SQLiteDatabase.CONFLICT_IGNORE注释应该像你所观察到的一样工作。 在尝试插入的时候,如果没有冲突的行,那么它会插入一个新的行,给定的值并返回新插入的行的ID。 另一方面,如果已经存在冲突的行(具有相同的唯一键),则传入的值将被忽略,并且现有的行将被保留,然后返回值将是-1来指示冲突情况。 要了解进一步的细节,并了解如何处理这个返回值,请阅读Android / SQLite:插入更新表列以保持标识符

    我使用的解决方法是使用insertOrThrow而不是insertWithOnConflict ,并显式捕获SQLiteConstraintException 。 您需要明确地捕获它,因为它从RuntimeExceptioninheritance。

    我不得不使用这种解决方法,因为在出​​现冲突时, insert将数据库scheme转储到日志,这是不可接受的。

     try { long id = db.insertWithOnConflict(StatusData.TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE); if (id == -1){ throw new RuntimeException(String.format("%s: Failed to insert [%s] to [%s] for unkwon reason.",TAG,values,uri)); }else return ContentUris.withAppendedId(uri, id); } 

    我仍然能够获取插入到数据库中的行,CONFLICT_IGNORE不能按预期工作@汤姆是正确的,但我不知道如果这个问题是固定的