当前位置: 首页 > 知识库问答 >
问题:

房间数据库在重新启动应用程序时丢失数据

陈晟睿
2023-03-14

根据文档,来自room.databaseBuilder()的room实例应该保存的数据是persist。但还是迷路了。我的项目必须数据

  1. 第一个数据库

@database(实体=[foodmodel::class],version=4,exportSchema=false)抽象类FoodDatabase:RoomDatabase(){

abstract val foodDatabaseDao: FoodDatabaseDao

companion object {

    @Volatile
    private var INSTANCE: FoodDatabase? = null

    fun getInstance(context: Context): FoodDatabase {
        synchronized(this) {
            var instance = INSTANCE

            if (instance == null) {
                instance = Room.databaseBuilder(
                    context.applicationContext,
                    FoodDatabase::class.java,
                    Constants.OVERVIEW_FOOD_DATABASE
                )
                    .fallbackToDestructiveMigration()
                    .build()

                INSTANCE = instance
            }

            return instance
        }
    }
}

第二数据库

 @Database(entities = [MyFoodModel::class], version = 3, exportSchema = false)

抽象类MyFoodDatabase:RoomDatabase(){abstract val MyFoodDatabaseDao:MyFoodDatabaseDao

 companion object {
     @Volatile
     private var INSTANCE: MyFoodDatabase? = null

     fun getInstance(context: Context): MyFoodDatabase {
         synchronized(this) {
             var instance = INSTANCE

             if (instance == null) {
                 instance = Room.databaseBuilder(
                     context.applicationContext,
                     MyFoodDatabase::class.java,
                     Constants.OVERVIEW_FOOD_DATABASE
                 )
                     .fallbackToDestructiveMigration()
                     .build()

                 INSTANCE = instance
             }

             return instance

         }
     }
 }

}

@Dao
interface MyFoodDatabaseDao {
    @Insert
    fun insert(food: MyFoodModel)

    @Query("SELECT * FROM MyFoodItems ORDER BY name DESC")
    fun getAllFood(): LiveData<List<MyFoodModel>>

    @Delete
    fun deleteFood(foodModel: MyFoodModel)
}
@Dao
interface MyFoodDatabaseDao {
    @Insert
    fun insert(food: MyFoodModel)

    @Query("SELECT * FROM MyFoodItems ORDER BY name DESC")
    fun getAllFood(): LiveData<List<MyFoodModel>>

    @Delete
    fun deleteFood(foodModel: MyFoodModel)
}

共有1个答案

公羊凌
2023-03-14

一个android应用程序可以有多个数据库。

如我所见,您为两个数据库[MyFoodDatabase,FoodDatabase]提供了相同的名称[constants.overview_food_database]。因此所有值都将写入一个名为constants.overview_food_database的数据库中。

请同时提供数据库的不同名称,然后重试。

正如您所说的,您正在使用相同数据库的两个不同实例,并且对于每个数据库实例,您都在更改数据库版本,但您没有将数据库迁移到该版本。相反,您使用的是fallbackToDestructiveMigration(),它不会使数据库崩溃,但在找到任何现有版本时清除数据。

请尝试以下步骤:

    null
val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
    // do nothing because you are not altering any table
    }
}
val MIGRATION_2_1 = object : Migration(2, 1) {
    override fun migrate(database: SupportSQLiteDatabase) {
    // do nothing because you are not altering any table
    }
}

但最好使用单个数据库实例,并在注释中包含与数据库关联的实体列表。因为room数据库实例非常昂贵。

https://developer.android.com/training/data-storage/room

注意:如果您的应用程序在单个进程中运行,那么在实例化AppDatabase对象时应该遵循singleton设计模式。每个RoomDatabase实例都相当昂贵,您很少需要访问单个进程中的多个实例。

 类似资料:
  • Spring Boot版本为1.5.6 使用的数据库是SQL Server2016,它也是在docker(windows容器)上。 问题:每当我重新启动SQL DB容器时,应用程序开始给出这个错误。 任何想法可以做什么来解决这个问题。 多谢了。

  • 当我从Android Studio运行时是正常的 但当我关闭并重新打开应用程序时,我得到了错误 IllegalStateException:Room无法验证数据完整性。看起来您已经更改了架构,但忘记更新版本号。您可以通过增加版本号来解决这个问题。 我的第二张桌子

  • 我们有一个Java应用程序,它使用Quartz来调度作业。我们使用的quartz版本是:Quartz-2.2.1 quartz配置使用JDBC作业存储。 如果在quartz scheduler对象上调用start方法时数据库连接关闭(由于断断续续的网络故障),它将以以下异常失败: 为了确保quartz scheduler成功启动,我们在代码中添加了重试,它在每1秒后调用quartz schedul

  • 正在为%1请求的包运行增量备份。Package@pm@with result:Success Package com.example.myapplication3 with result:Success备份已完成with 当我重新安装应用程序时,它不还原,当我使用令牌和包名并强制在adb中还原时,它也不还原,而是给我: 我觉得RestoreStarting:0包中的错误一定很明显,但我在网上找不到

  • 我想在应用程序启动时使用Spring ehCache将数据从数据库加载到缓存中,即在调用任何其他方法之前服务器启动时。我不想使用构造函数。请帮帮我。