代码之家  ›  专栏  ›  技术社区  ›  SqueezeOJ

Kotlin Jetpack Compose项目中的房间插入在运行之间不持久

  •  0
  • SqueezeOJ  · 技术社区  · 4 年前

    我正在做一个带有预填充房间数据库的Android Jetpack Compose项目。

    然而,读取数据库效果很好。。。

    当我插入一条新记录时,它不会持久到我下次运行应用程序时。 我没有使用inMemoryDatabaseBuilder()。

    我知道当应用程序在内存中时它可以工作,因为我可以在屏幕上看到结果,但是,一旦我停止应用程序,我的插入就会消失。我还检查了底层数据库文件,无论是在数据库运行时还是在关闭数据库后,我的插入都从未提交到数据库。

    我做错了什么?

    谢谢你的帮助!


    这是我的 用户界面 将一个新人添加到我的数据库中:

    viewModel.insertMyInfo(newMyInfo)
    

    它在内存中工作,但一旦我退出应用程序,新添加的记录就会消失。

    App Inspector LiveData显示我添加的内容。


    viewModel插入函数

    fun insertMyInfo(myInfo: MyInfo) {
        myInfoRepository.insertMyInfo(myInfo)
    }
    

    似乎只致力于内存,而不是磁盘。


    DAO@插入

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertMyInfo(vararg myInfo: MyInfo)
    

    我试过这个 suspend 没有区别


    储存功能

    fun insertMyInfo(newMyInfo: MyInfo) {
        coroutineScope.launch(Dispatchers.IO) {
            myInfoDAO.insertMyInfo(newMyInfo)
        }
    }
    

    数据库

    @Database(entities = [(MyInfo::class)], version = 5)
    abstract class MyInfoRoomDatabase: RoomDatabase() {
    
        abstract fun myInfoDao(): MyInfoDAO
        companion object {
    
            private var INSTANCE: MyInfoRoomDatabase? = null
    
            fun getInstance(context: Context): MyInfoRoomDatabase {
                synchronized(this) {
                    var instance = INSTANCE
    
                    if (instance == null) {
                        instance = Room.databaseBuilder(
                            context.applicationContext,
                            MyInfoRoomDatabase::class.java,
                            "MyInfo"
                        ).createFromAsset("MyInfo.db")
                            .fallbackToDestructiveMigration()
                            .build()   // End Room Database Builder
    
                        INSTANCE = instance
                    }   // End If Null
    
                    return instance
    
                }   // End Synchronized
    
            }   // End Get Instance
    
        }   // End Companion Object
    
    }   // End Database Abstract Class
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   MikeT    4 年前

    您的问题可能是,您的问题是由于版本号增加以及 .fallbackToDestructiveMigration 同时找不到迁移。

    这导致数据库被破坏,然后由于数据库不存在,它是从资产文件创建的,因此更改被有效地撤消。

    因此,如果存在架构更改(对@Entity注释类所做的更改,该类包含在被定义为@Database注释一部分的实体列表中),则应提供一个迁移,该迁移对保留数据的现有数据库进行更改,以进行版本更改(在您的情况下,该迁移处理从版本4到版本5的架构更改)。另一种选择是使用自动迁移(注意限制和要求),请参阅 https://medium.com/androiddevelopers/room-auto-migrations-d5370b0ca6eb