【发布时间】: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