【问题标题】:Pre-packaged database has an invalid schema column order预打包的数据库具有无效的架构列顺序
【发布时间】:2021-05-26 19:07:21
【问题描述】:

我正在尝试在我的 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', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, uts=Column{name='uts', type='REAL', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
 
Found:
TableInfo{name='viewLog', columns={VID=Column{name='VID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, UTS=Column{name='UTS', type='REAL', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}, MID=Column{name='MID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], 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>
}

如果这是我遇到的问题,谁能帮我对列进行排序?

【问题讨论】:

    标签: android sqlite kotlin android-room


    【解决方案1】:

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

    例如以下数据库(另存为资产 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', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, uts=Column{name='uts', type='REAL', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
     Found:
    TableInfo{name='viewLog', columns={VID=Column{name='VID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, UTS=Column{name='UTS', type='real', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}, MID=Column{name='MID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2021-05-10
      • 1970-01-01
      • 2021-03-02
      • 2020-06-03
      • 2020-03-05
      相关资源
      最近更新 更多