我正在为数据库表的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”吗?
任何有关上述问题的指针将不胜感激。
谢谢。
答案 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:唯一约束 失败