房间数据库迁移出现致命异常:android.database.sqlite.SQLiteConstraintException:唯一约束失败

房间数据库迁移出现致命异常:android.database.sqlite.SQLiteConstraintException:唯一约束失败,android,sqlite,android-room,Android,Sqlite,Android Room,我正在为我的DB表的两列添加唯一约束,以便表中的每一行都是唯一的。因此,在添加唯一约束的同时,我还将执行DB迁移,如下所示: static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL(“CREATE UNIQUE INDEX index

我正在为我的DB表的两列添加唯一约束,以便表中的每一行都是唯一的。因此,在添加唯一约束的同时,我还将执行DB迁移,如下所示:

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>)”);
     }
 };
静态最终迁移\u 1\u 2=新迁移(1,2){
@凌驾
public void migrate(支持sqlitedatabase数据库){
execSQL(“在()上创建唯一索引”;
}
};
但是下面的崩溃:

致命异常:android.database.sqlite.SQLiteConstraintException:唯一约束失败:。(代码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”存在一些相关问题(参考:),所以我应该迁移到“room:runtime:1.1.1-rc1”吗

任何关于上述问题的建议都将不胜感激


谢谢你

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

为了理解这个问题,让我们举个例子

+----+------------+-----------+------------+
| 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>)”);
     }
 };
静态最终迁移\u 1\u 2=新迁移(1,2){
@凌驾
public void migrate(支持sqlitedatabase数据库){
execSQL(“删除列中重复值的查询”)
execSQL(“在()上创建唯一索引”;
}
};
如何从列中删除重复值取决于您的业务逻辑

若在将列设置为唯一索引之前并没有删除重复项,那个么您将面临

android.database.sqlite.SQLiteConstraintException:唯一约束 失败