预打包数据库的架构无效:notes(com.muradsapplications.quicknote.model.Notes).(Kotlin)

j7dteeu8  于 2023-04-07  发布在  Kotlin
关注(0)|答案(1)|浏览(129)

我的错误是:

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)

3htmauhk

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将不接受此情况。
调查这件事

  • 源数据库中有8列,实体中只有7列。noteText列已从实体中省略。
  • 源中的titlesubtitleimagepathcolorwebLink列没有NOT NULL约束。

为了确定上述情况,将日志的预期/发现部分放入测试编辑器中,在每列处进行拆分,并将来自发现和预期的列复制到各自的行中,每一行位于各自的另一行之上。
例如:-

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=[]}
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=[]}
    
    
    id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='undefined'}, F
    id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='undefined'}, E
    
    Title=Column{name='Title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, F
    title=Column{name='title', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'} E
    
    dateTime=Column{name='dateTime', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, F
    dateTime=Column{name='dateTime', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, E
    
    subtitle=Column{name='subtitle', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, F
    subtitle=Column{name='subtitle', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, E
    
    noteText=Column{name='noteText', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, F
    ???? E
    
    imagePath=Column{name='imagePath', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, F
    imagePath=Column{name='imagePath', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, E
    
    color=Column{name='color', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, F
    color=Column{name='color', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, E
    
    webLink=Column{name='webLink', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='undefined'}, F
    webLink=Column{name='webLink', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, E

因此,上述战略需要相应修改

这可能仅仅是因为所使用的源数据库实际上不是预期的源数据库。它肯定与图像中描述的数据库不匹配。
否则,您需要:-
1.确定notetext列是否是必需的,如果不是,则INSERT INTO original SELECT * FROM old_original将必须改变,以便指定特定的必需列而不是SELECT *
1.对于不具有NOT NULL约束的列,则必须将空值转换为非空值(例如,使用合并函数)。

相关问题