9

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

表创建:

编辑 :

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);
4

5 回答 5

9

insertWithOnConflict,使用 SQLiteDatabase.CONFLICT_IGNORE 不能按预期工作,应该完全避免,根据这个问题:
https ://code.google.com/p/android/issues/detail?id=13045

于 2013-04-18T17:24:49.327 回答
2

Android 期望调用主键列_id。可能是原因:由于该列不存在,因此无法返回值并返回-1。

于 2012-09-11T02:40:37.077 回答
2

SQLiteDatabase.CONFLICT_IGNORE 注释的功能应该与您观察到的相同。在尝试插入时,如果没有冲突的行,那么它将插入具有给定值的新行并返回新插入行的 id。另一方面,如果已经存在冲突的行(具有相同的唯一键),则传入的值将被忽略并保留现有的行,然后返回值将为 -1 以指示冲突情况。要了解更多详细信息并了解如何处理此返回值,请阅读Android/SQLite:插入更新表列以保留标识符

于 2013-04-15T12:07:37.413 回答
1

我使用的解决方法是使用insertOrThrow而不是insertWithOnConflict,并显式捕获SQLiteConstraintException. 您需要显式捕获它,因为它继承自RuntimeException.

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

于 2014-11-10T17:55:04.763 回答
0
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 无法按预期工作@Tom 是正确的,但我不确定该问题是否已解决

于 2013-08-08T14:35:39.850 回答