【发布时间】:2020-09-15 16:18:07
【问题描述】:
我的任务是将我们应用程序的当前架构(使用 Cupboard)迁移到 Room,我在第一项工作中遇到了一些问题,即迁移数据库对象,目前用 Java 编写(Cupboard 仅支持Java),使它们与 Room 一起工作。这是一个例子:
public class ItemDb {
public Long _id;
public String type;
public String subtype;
public long scheduledTime;
public int iteration;
public String data1;
public String data2;
public String data3;
这就是它在数据库中的样子:
我对这个实体所做的是在 Kotlin 中创建一个 @Entity 类以在 Room 中使用,它看起来像这样:
@Entity(tableName = "ItemDb")
data class ItemDb(
@PrimaryKey(autoGenerate = true)
val _id: Long? = 0,
val type: String,
val subtype: String,
val scheduledTime: Long,
val iteration: Int,
val data1: String? = null,
val data2: String? = null,
val data3: String? = null
)
每当我尝试查询数据库时,我都会收到此异常:
预打包数据库的架构无效:ItemDb(com.example.room.model.items.ItemDb)。 预期的: TableInfo{name='ItemDb', columns={scheduledTime=Column{name='scheduledTime', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, subtype= Column{name='subtype', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, data3=Column{name='data3', type='TEXT' ,affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='null'},data2=Column{name='data2',type='TEXT',affinity='2',notNull=false,primaryKeyPosition= 0,defaultValue='null'},data1=Column{name='data1',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='null'},迭代=Column{ name='iteration',type='INTEGER',affinity='3',notNull=true,primaryKeyPosition=0,defaultValue='null'},_id=Column{name='_id',type='INTEGER',affinity ='3',notNull=false,primaryKeyPosition=1,defaultValue='null'},type=Column{name='type',type='TEXT',affinity='2',notNull=true,primaryKeyPosition=0, defaultValue='null'}},foreignKeys=[],indices=[]} 成立: TableInfo{name='ItemDb', columns={scheduledTime=Column{name='scheduledTime', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, subtype= Column{name='subtype', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, data3=Column{name='data3', type='TEXT' ,affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='null'},data2=Column{name='data2',type='TEXT',affinity='2',notNull=false,primaryKeyPosition= 0,defaultValue='null'},data1=Column{name='data1',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='null'},迭代=Column{ name='iteration',type='INTEGER',affinity='3',notNull=false,primaryKeyPosition=0,defaultValue='null'},_id=Column{name='_id',type='integer',affinity ='3',notNull=false,primaryKeyPosition=1,defaultValue='null'},type=Column{name='type',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0, defaultValue='null'}},foreignKeys=[],indices=[]}
通过比较两者,我可以看到一些字段应该被标记为notNull,但它们似乎被标记为nullable,而不是即使 Kotlin 类将这些字段声明为@987654328 @ 避免使用可以为空的?。
我做错了什么? 如果您需要有关数据库体系结构的更多信息,我可以轻松地提供它们。谢谢!
【问题讨论】:
标签: android sqlite android-room android-database