【问题标题】:Fatal Exception on Room DB Migration: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failedRoom DB 迁移的致命异常:android.database.sqlite.SQLiteConstraintException:UNIQUE 约束失败
【发布时间】:2018-07-01 10:45:33
【问题描述】:

我正在为我的数据库表的 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:唯一约束失败:。 (代码 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”,它有一些与之相关的问题 (Ref:https://issuetracker.google.com/issues/79362399),所以我应该迁移到“房间:运行时:1.1.1-rc1”?

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

谢谢你。

【问题讨论】:

    标签: android sqlite android-room


    【解决方案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:唯一约束 失败

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2015-07-22
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多