Intereting Posts
Пользовательская операция ожидает завершения фоновой работы Развернуть все дочерние элементы в расширенном виде списка Получить серийный номер устройства Android-устройства Adb shell и adb push для конкретного avd Тесты для Android с помощью кинжала 2 Выберите «Android XX» или «API Google» в новом проекте Как установить значение по умолчанию в IntelliJ 12 для поиска? Предлагаемый протокол для андроид-ардуиновой связи Как пропустить или избежать опции «пересдать и просмотреть» после съемки фотографии с камеры с помощью ACTION_IMAGE_CAPTURE Как использовать CompositeDisposable для RxJava 2? Когда закрыта «потребительская сторона» TextureView? Android: Детектор дрожания слишком чувствителен Обмен ссылкой на WhatsApp с мобильного сайта (а не приложения) для Android Пользовательское хранилище данных на локальном компьютере с App Engine Настройка каталога настраиваемых ресурсов для модульного тестирования в Android Studio

Android: SQLite – insertWithOnConflict

Я вызываю insertWithOnConflict, используя SQLiteDatabase.CONFLICT_IGNORE. Однако при возникновении конфликта возвращается «-1» вместо идентификатора существующей строки. Как это исправить?

Создание таблицы:

РЕДАКТИРОВАТЬ :

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

Solutions Collecting From Web of "Android: SQLite – insertWithOnConflict"

InsertWithOnConflict, используя SQLiteDatabase.CONFLICT_IGNORE, не работает должным образом и, вероятно, следует избегать в целом по этой проблеме:
https://code.google.com/p/android/issues/detail?id=13045

Android ожидает, что столбец первичного ключа будет называться _id . Может быть причиной: поскольку столбец не существует, он не может вернуть значение и возвращает -1.

Комментарий SQLiteDatabase.CONFLICT_IGNORE должен функционировать так же, как и вы. При попытке вставить, если нет противоречивой строки, тогда она будет вставлять новую строку с заданными значениями и возвращать идентификатор вновь вставленной строки. С другой стороны, если есть уже конфликтующая строка (с тем же уникальным ключом), тогда входящие значения будут игнорироваться, а существующая строка будет сохранена, а затем возвращаемое значение будет равно -1, чтобы указать конфликтный сценарий. Чтобы узнать подробности и понять, как справиться с этим возвращаемым значением, прочитайте колонки Android / SQLite: Insert-Update, чтобы сохранить идентификатор

Обходной путь, который я использовал, использует insertOrThrow вместо insertWithOnConflict и явно захватывает SQLiteConstraintException . Вам нужно явно поймать его, потому что он наследует RuntimeException .

Мне пришлось использовать это обходное решение, потому что insert удаляла схему базы данных в журналы, когда был конфликт, и это было неприемлемо.

 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 прав, но я не уверен, что эта проблема исправлена