如何通过迁移处理表字段移除并完成含LocalDate字段的数据迁移?
解决方案
你的四步迁移思路没问题,关键是直接复用旧表中LocalDate字段的原始存储值就行——因为Room的TypeConverter只是把LocalDate转成SQLite支持的TEXT/INTEGER存在数据库里,迁移是SQL层面的操作,不需要在迁移过程中做额外的类型转换,具体步骤如下:
1. 明确旧表中date字段的存储类型
先确认你的DateTypeConverter是把LocalDate转成TEXT(比如ISO格式字符串"2024-05-20")还是INTEGER(比如epoch day,即从1970-01-01开始的天数),新表的date字段类型要和旧表完全一致。
2. 创建新表的SQL语句
假设旧表名为original_table,新表先叫temp_table,根据date的存储类型写SQL:
- 如果是TEXT类型:
CREATE TABLE temp_table ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, date TEXT NOT NULL, amount INTEGER NOT NULL, uri TEXT NOT NULL, tag TEXT NOT NULL, toList INTEGER NOT NULL, -- Room中Boolean映射为INTEGER(0/1) inUse INTEGER NOT NULL, listValue INTEGER NOT NULL );
- 如果是INTEGER类型,把
date TEXT NOT NULL改成date INTEGER NOT NULL即可。
3. 从旧表导入数据
直接用INSERT SELECT语句把旧表数据复制到新表,date字段原样取值(注意:如果旧表有要移除的字段,SELECT时不要包含那个字段):
INSERT INTO temp_table (id, name, date, amount, uri, tag, toList, inUse, listValue) SELECT id, name, date, amount, uri, tag, toList, inUse, listValue FROM original_table;
4. 完成迁移收尾
DROP TABLE original_table; ALTER TABLE temp_table RENAME TO original_table;
关键注意点
- Room中Boolean类型在SQLite里实际存的是INTEGER(0代表false,1代表true),所以新表的
toList、inUse字段必须定义为INTEGER,不能写BOOLEAN。 - 一定要保证新表的date字段类型和旧表完全匹配,否则会出现数据读取异常。
内容的提问来源于stack exchange,提问作者nikenzo
相关产品推荐
相关产品推荐

