У меня есть таблица SQLite:
CREATE TABLE regions (_id INTEGER PRIMARY KEY, name TEXT, UNIQUE(name));
И некоторые Android-коды:
Validate.notBlank(region);
ContentValues cv = new ContentValues();
cv.put(Columns.REGION_NAME, region);
long regionId =
db.insertWithOnConflict("regions", null, cv, SQLiteDatabase.CONFLICT_IGNORE);
Validate.isTrue(regionId > -1,
"INSERT ON CONFLICT IGNORE returned -1 for region name '%s'", region);
В повторяющихся строках insertWithOnConflict() возвращает -1, указывая на ошибку, и Validate затем бросает с:
INSERT ON CONFLICT IGNORE returned -1 for region name 'Overseas'
Документация SQLite ON CONFLICT (акцент мой) гласит:
При наличии соответствующего нарушения ограничений алгоритм разрешения IGNORE пропускает одну строку, которая содержит нарушение ограничений, и продолжает обрабатывать последующие строки инструкции SQL, как будто ничего не получилось. Другие строки до и после строки, содержащей нарушение ограничения, вставляются или обновляются нормально. При использовании алгоритма разрешения конфликта IGNORE ошибка не возвращается.
Документация Android insertWithOnConflict() сообщает:
Возвраты идентификатор строки вновь вставленной строки ИЛИ первичный ключ существующей строки, если входной параметр "конфликтAlgorithm" = CONFLICT_IGNORE ИЛИ -1, если какая-либо ошибка
CONFLICT_REPLACE не является вариантом, поскольку замена строк изменит их первичный ключ вместо того, чтобы просто вернуть существующий ключ:
sqlite> INSERT INTO regions (name) VALUES ("Southern");
sqlite> INSERT INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
2|Overseas
sqlite> INSERT OR REPLACE INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
3|Overseas
sqlite> INSERT OR REPLACE INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
4|Overseas
Я думаю, что insertWithOnConflict() должен, в повторяющихся строках, вернуть мне первичный ключ (столбец _id) дублированной строки — поэтому я никогда не должен получать ошибку для этой вставки. Почему insertWithOnConflict() выдает ошибку? Какую функцию мне нужно вызвать, чтобы я всегда возвращал действительный идентификатор строки?