Неустранимое исключение при переносе БД комнаты: android.database.sqlite.SQLiteConstraintException: ограничение UNIQUE не выполнено - PullRequest
0 голосов
/ 01 июля 2018

Я добавляю уникальные ограничения для 2 столбцов моей таблицы БД, чтобы каждая строка таблицы могла быть уникальной. И поэтому наряду с добавлением уникальных ограничений я также выполняю миграцию БД, как показано ниже:

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
     @Override
     public void migrate(SupportSQLiteDatabase database) {
         database.execSQL(“CREATE UNIQUE INDEX index_<MyTableName>_<ColumnName> ON <MyTableName> (<ColumnName>)”);
     }
 };

Но получаю грохот:

Неустранимое исключение: android.database.sqlite.SQLiteConstraintException: ограничение UNIQUE не выполнено:. (код 2067) на android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount (SQLiteConnection.java) на android.database.sqlite.SQLiteConnection.executeForChangedRowCount (SQLiteConnection.java:734) на android.database.sqlite.SQLiteSession.executeForChangedRowCount (SQLiteSession.java:754) на android.database.sqlite.SQLiteStatement.executeUpdateDelete (SQLiteStatement.java:64) на android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:1677)

Примечание. Одна из причин (но не уверенная) может быть в следующем: поскольку я использую "room: runtime: 1.1.0", с которой связана некоторая проблема (ссылка: https://issuetracker.google.com/issues/79362399), то мне следует перейти на "комнату: время выполнения: 1.1.1-rc1"?

Любой указатель на вышеуказанную проблему будет высоко оценен.

Спасибо.

1 Ответ

0 голосов
/ 05 апреля 2019

Вам необходимо обработать существующие записи для дублирования контента, чтобы применить уникальные ограничения во время миграции.

Чтобы понять проблему, давайте рассмотрим пример.

+----+------------+-----------+------------+
| id | first_name | last_name |   mobile   |
+----+------------+-----------+------------+
|  1 | John       | Smith     | 1234567890 |
|  2 | Adel       | Jan       | 0987654321 |
|  3 | Marray     | Jane      | 1234567890 |
+----+------------+-----------+------------+

Над таблицей указан номер мобильного телефона, который вы можете преобразовать в уникальный индекс.

Для этого сначала необходимо удалить повторяющиеся значения из этого столбца, а затем применить запрос на миграцию.

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
     @Override
     public void migrate(SupportSQLiteDatabase database) {

      database.execSQL("Query to remove duplicate value in column")

      database.execSQL(“CREATE UNIQUE INDEX index_<MyTableName>_<ColumnName> ON <MyTableName> (<ColumnName>)”);
     }
 };

Как удалить дублирующее значение из столбца, зависит от вашей бизнес-логики.

Если вы не удалите дубликат, прежде чем сделать столбец уникальным индексом, тогда вы столкнетесь.

android.database.sqlite.SQLiteConstraintException: УНИКАЛЬНОЕ ограничение не удалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...