【问题标题】:Android room library Migration change type of previous columnAndroid房间库迁移上一栏的变化类型
【发布时间】:2019-02-12 09:54:39
【问题描述】:

我正在使用房间库来处理我的 android 应用程序中的数据库部分。我想从我的数据库版本 3 迁移到 4。我在迁移时在表中添加了两个新列。但是在迁移时,它将 date_time 列的类型从 TEXT 更改为 DATETIME。我遇到了以下异常。

 java.lang.IllegalStateException: Migration didn't properly handle table_transactions(com.example.braintech.demosmspickerapp.database.TransactionModel).
    Expected:
    TableInfo{name='table_transactions', columns={entry_type=Column{name='entry_type', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, dg=Column{name='dg', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, balance=Column{name='balance', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, date=Column{name='date', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, date_time=Column{name='date_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, reading_grid=Column{name='reading_grid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, note=Column{name='note', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
    Found:
    TableInfo{name='table_transactions', columns={entry_type=Column{name='entry_type', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, dg=Column{name='dg', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, balance=Column{name='balance', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}, date=Column{name='date', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, date_time=Column{name='date_time', type='DATETIME', affinity='1', notNull=false, primaryKeyPosition=0}, reading_grid=Column{name='reading_grid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, note=Column{name='note', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

实体

@Entity(tableName = AppConstants.TABLE_TRANSACTIONS)
public class TransactionModel implements Serializable {


    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "date")
    public String date;

    @ColumnInfo(name = "balance")
    public String balance;

    @ColumnInfo(name = "reading_grid")
    public String reading_grid;

    @ColumnInfo(name = "dg")
    public String dg;

    @ColumnInfo(name = "date_time")
    public String date_time;

    @ColumnInfo(name = "note")
    public String note;

    @ColumnInfo(name = "entry_type")
    public String entry_type;

    @Ignore
    Date dateForCompare;
}

迁移代码

static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {


        database.execSQL("ALTER TABLE '" + AppConstants.TABLE_TRANSACTIONS + "' ADD COLUMN 'note' TEXT ");
        database.execSQL("ALTER TABLE '" + AppConstants.TABLE_TRANSACTIONS + "' ADD COLUMN 'entry_type' TEXT ");
        Log.d("VROM", "Migration");
    }
};

【问题讨论】:

  • 这表示您现有的表(数据库中的“找到”表)正在使用DATETIME,但您的房间定义将date_time 作为字符串,因此是TEXT 预期类型。版本 3 不是由 Room 生成的吗?
  • 没有版本 3 是由简单的数据库打开帮助程序类生成的
  • 您的迁移需要处理所有差异 - DATETIME 不是 Room 中 String 字段支持的列类型,因此您需要将其转换为所需的类型。
  • 如何转换

标签: android database migration


【解决方案1】:

在你的例外中,我看到了差异,第一个是:

Expected: id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}

Found: id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}

notNull=true 更改为notNull=false

第二个是:

Expected: date_time=Column{name='date_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}

Found: date_time=Column{name='date_time', type='DATETIME', affinity='1', notNull=false, primaryKeyPosition=0}

type='TEXT', affinity='2' 更改为type='DATETIME', affinity='1'

那么,您可以尝试在主键上添加@NonNull 注释并尝试再次迁移吗?

【讨论】:

  • 所以我需要再次更改数据库版本
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 2018-11-11
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2019-02-13
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多