微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

预打包数据库的架构列顺序无效

如何解决预打包数据库的架构列顺序无效

我正在尝试在我的 Android 应用程序中实现 Room,但出现错误

java.lang.IllegalStateException: Pre-packaged database has an invalid schema: viewLog(myApp.ViewLogModel).
 
Expected:
TableInfo{name='viewLog',columns={vid=Column{name='vid',type='INTEGER',affinity='3',notNull=true,primaryKeyPosition=0,defaultValue='null'},mid=Column{name='mid',primaryKeyPosition=1,uts=Column{name='uts',type='REAL',affinity='4',defaultValue='null'}},foreignKeys=[],indices=[]}
 
Found:
TableInfo{name='viewLog',columns={VID=Column{name='VID',UTS=Column{name='UTS',MID=Column{name='MID',indices=[]}

我确实看到 utsmid 列被切换,但是我一直无法弄清楚如何更改 TableInfo 中的列顺序。

我的房间数据库代码

@Database(entities = [ViewLogModel::class,CacheInputModel::class,CachePageModel::class],version = 1)
    abstract class MyDatabase : RoomDatabase() {
    abstract fun cacheInputDao(): CacheInputDao
    abstract fun cachePageDao(): CachePageDao
    abstract fun viewLogDao(): ViewLogDao

    companion object {
        // For Singleton Instance
        @Volatile
        private var INSTANCE: MyDatabase? = null

        fun getAppDataBase(context: Context): MyDatabase {
            return INSTANCE ?: synchronized(this) {
                INSTANCE ?: Room.databaseBuilder(context.applicationContext,MyDatabase::class.java,"appDatabase")
                    .createFromAsset("app.db")
                    .build()
            }
        }

        fun destroyDataBase(){
            INSTANCE = null
        }
    }
}

ViewLogModel

@Entity(tableName = "viewLog")
data class ViewLogModel(
    @PrimaryKey val mid: Int,val vid: Int,val uts: Float)

ViewLogDao

@Dao
interface ViewLogDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertOrUpdateViewLog(viewLog: ViewLogModel)

    @Update
    suspend fun updateViewLog(viewLog: ViewLogModel)

    @Delete
    suspend fun deleteallViewLog(viewLog: ViewLogModel)

    @Query("DELETE FROM viewlog WHERE VID= :vid OR UTS < :uts")
    suspend fun deleteViewLog(vid: Int,uts: Float)

    @Query("SELECT * FROM viewLog")
    suspend fun getAll(): List<ViewLogModel>

    @Query("SELECT * FROM viewLog WHERE vid = :vid")
    suspend fun getViewLog(vid: Int): List<ViewLogModel>
}

如果这是我遇到的问题,有人可以帮我订购列吗?

解决方法

我认为您的问题不在于顺序,而在于列名的大小写。

例如以下数据库(另存为资产 appcase.db)定义为:-

CREATE TABLE "viewLog" (
  "MID" INTEGER NOT NULL,"UTS" real NOT NULL,"VID" INTEGER NOT NULL,PRIMARY KEY ("MID")
);

失败:-

 Caused by: java.lang.IllegalStateException: Pre-packaged database has an invalid schema: viewLog(a.a.so67711264kotlinroomprepackageddb.ViewLogModel).
 Expected:
TableInfo{name='viewLog',columns={vid=Column{name='vid',type='INTEGER',affinity='3',notNull=true,primaryKeyPosition=0,defaultValue='null'},mid=Column{name='mid',primaryKeyPosition=1,uts=Column{name='uts',type='REAL',affinity='4',defaultValue='null'}},foreignKeys=[],indices=[]}
 Found:
TableInfo{name='viewLog',columns={VID=Column{name='VID',UTS=Column{name='UTS',type='real',MID=Column{name='MID',indices=[]}

但是,使用 DDL 的数据库是:-

CREATE TABLE "viewLog" (
  "mid" INTEGER NOT NULL,"uts" real NOT NULL,"vid" INTEGER NOT NULL,PRIMARY KEY ("mid")
)

按预期工作。

因此,您需要像上面一样更改 DDL 或更改实体以反映 DDL,例如以下适用于原始(失败的)DDL:-

@Entity(tableName = "viewLog")
data class ViewLogModel(
    @PrimaryKey val MID: Int,val VID: Int,val UTS: Float)

或者您也可以使用 @ColumnInfo 之类的:-

@Entity(tableName = "viewLog")
data class ViewLogModel(
    @PrimaryKey @ColumnInfo(name = "MID") val mid: Int,@ColumnInfo(name ="VID") val vid: Int,@ColumnInfo(name = "UTS") val uts: Float)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?