房间数据库迁移出现致命异常:android.database.sqlite.SQLiteConstraintException:唯一约束失败
我正在为我的DB表的两列添加唯一约束,以便表中的每一行都是唯一的。因此,在添加唯一约束的同时,我还将执行DB迁移,如下所示:房间数据库迁移出现致命异常: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
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:唯一约束
失败