Room DB迁移的致命异常:android.database.sqlite.SQLiteConstraintException:UNIQUE约束失败

时间:2018-07-01 10:45:34

标签: android sqlite android-room

我正在为数据库表的2列添加UNIQUE约束,以便表的每一行都可以是唯一的。因此,除了添加UNIQUE约束之外,我还在执行数据库迁移,如下所示:

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),所以我应该这样做吗?迁移到“ room:runtime:1.1.1-rc1”吗?

任何有关上述问题的指针将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

您需要处理重复内容的现有记录,以便在迁移期间应用唯一约束。

要了解该问题,我们举个例子。

+----+------------+-----------+------------+
| 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:唯一约束   失败