我的错误是:
TableInfo{name='notes', columns={dateTime=Column{name='dateTime', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, color=Column{name='color', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, imagePath=Column{name='imagePath', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, webLink=Column{name='webLink', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, subtitle=Column{name='subtitle', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='undefined'}, title=Column{name='title', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='notes', columns={id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='undefined'}, Title=Column{name='Title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, dateTime=Column{name='dateTime', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, subtitle=Column{name='subtitle', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, noteText=Column{name='noteText', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, imagePath=Column{name='imagePath', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, color=Column{name='color', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, webLink=Column{name='webLink', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}}, foreignKeys=[], indices=[]}
数据库图像:[1]:https://i.stack.imgur.com/VykMI.png
这是我的实体:
@Entity(tableName = "notes")
data class Notes(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") @NotNull var id : Int,
@ColumnInfo(name = "title") @NotNull var title : String,
@ColumnInfo(name = "dateTime") @NotNull var dateTime : String,
@ColumnInfo(name = "subtitle") @NotNull var subtitle : String,
@ColumnInfo(name = "imagePath") @NotNull var imagePath : String,
@ColumnInfo(name = "color") @NotNull var color : String,
@ColumnInfo(name = "webLink") @NotNull var webLink : String
) : java.io.Serializable{
}
我的刀提供者与希尔特
@Provides
@Singleton
fun provideNoteDao(@ApplicationContext context: Context) : NotesDao{
val db = Room.databaseBuilder(context,MyDatabase::class.java,"notes.sqlite")
.createFromAsset("notes.sqlite").build()
return db.getNotesDao()
}
}
我试图访问我的本地数据库与ROOM。但我面临的错误。(Kotlin)
1条答案
按热度按时间3htmauhk1#
通常情况下,您不太可能只使用不是通过Room创建的数据库并通过Room使用它。
当您编写一个@Entity注解的类并将该类包含在@Database注解的类中的实体列表中时。Room确定列及其类型。RoomExpects与它打开的数据库完全匹配。即RoomFound。如果它们不匹配,则会出现错误,显示Room期望的内容和发现的内容,并且两者之间存在差异,尽管难以检测失配是什么。
没有真实的去尝试确定它们之间的区别。简而言之,数据库在打开时必须符合Room的预期。Room会根据Room的预期生成SQL,然后可以将其用作转换源数据库的基础。
转换可以在房间外完成,转换后的数据库可以是预打包的数据库。或者
prepackagedDatabaseCallback
方法。在任何一种情况下,在许多情况下,转换将沿着以下路线进行:
1.重命名源数据库,例如
ALTER TABLE RENAME original TO old_original;
1.复制Room生成的SQL,它将根据Room的预期创建表
1.从旧表填充新表,例如
INSERT INTO original SELECT * FROM old_original;
1.删除预转换的重命名表,例如
DROP TABLE IF EXISTS old_original;
*original表示将使用的表的名称(在您的情况下请注意)
*注意请参阅下面的其他部分,因为您提供的预打包数据库可能不是您期望提供的预打包数据库,即您提供的数据库映像与提供的实际数据库不匹配。
所有由房间生成的重要SQL可以通过以下方式找到:
1.使用Android视图
1.定位Android视图中显示的java(生成的)文件夹/目录
1.查找与
@Database
注解类同名但后缀为Impl的类。1.查找方法createAllTables
对于room需要的每个表,都会有一个
CREATE ....
SQL语句。对于room_master_table,也会有两个语句,一个用于创建它,另一个用于插入单行。不需要创建room_master_table,也不需要插入行,Room管理表,应该让它来做。其他
在编辑您的问题并将日志更改为显示为代码后,很明显存在差异,因为每个长度不同,并且很明显源/原始表中的列数多于通过实体定义的列数。Room将不接受此情况。
调查这件事
为了确定上述情况,将日志的预期/发现部分放入测试编辑器中,在每列处进行拆分,并将来自发现和预期的列复制到各自的行中,每一行位于各自的另一行之上。
例如:-
因此,上述战略需要相应修改。
这可能仅仅是因为所使用的源数据库实际上不是预期的源数据库。它肯定与图像中描述的数据库不匹配。
否则,您需要:-
1.确定notetext列是否是必需的,如果不是,则
INSERT INTO original SELECT * FROM old_original
将必须改变,以便指定特定的必需列而不是SELECT *
。1.对于不具有NOT NULL约束的列,则必须将空值转换为非空值(例如,使用合并函数)。