0

我对 Android 开发有点陌生,但我正在接手一些比我做更多实验的项目。

我正在制作一个应用程序,它在启动时从 Internet 检索数据并创建(或更新)一个房间数据库来存储信息。

到目前为止,它有效。但是,我注意到当我推送应用程序的更新时,对于某些用户,数据库不再更新。他们可以重新安装应用程序,它不会改变任何东西。唯一有效的是清除缓存并重新启动应用程序。然后一切恢复正常,当从互联网检索数据时,它们被正确插入数据库。但是问题在下一次更新时又回来了。

我添加了“fallbackToDestructiveMigration()”选项,但它没有帮助,因为它本身不是数据库的迁移,因为这里的结构没有改变。

理想情况下,我想保留数据库中已经存在的数据。

我正在使用 Room 2.2.5 和 API 28。

我不确定为什么更新应用程序会导致数据库不再更新。也许应用程序的新版本会创建另一个数据库并填充这个数据库,但应用程序仍在使用旧数据库(不再更新)。

存储模块

val storageModule = module {
    single {
        Room.databaseBuilder(androidContext(), LessonDatabase::class.java, "MyDB")
            .fallbackToDestructiveMigration().build()
    }

    single {
        get<LessonDatabase>().lessonDao()
    }
}

课程资料:

@Database(entities = [Lesson::class], version = BuildConfig.DATABASE_VERSION, exportSchema = false)
abstract class LessonDatabase : RoomDatabase() {
    abstract fun lessonDao(): LessonDao
}

道:

@Dao
interface LessonDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertLesson(lesson: Lesson)

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insertLessons(lessons: List<Lesson>)

    @Update
    fun updateLesson(lesson: Lesson)

    @Delete
    fun deleteLesson(lesson: Lesson)

    @Query("DELETE FROM Lesson")
    fun clearLessons()

    @Query("SELECT * FROM Lesson WHERE id == :id")
    fun getLessonById(id: String): Lesson

    @Query("SELECT * FROM Lesson ORDER BY creation_date DESC")
    fun getLessons(): List<Lesson>

    @Query("SELECT * FROM Lesson WHERE favorite = 1")
    fun getFavoriteLessons(): List<Lesson>

    @Query("SELECT * FROM Lesson WHERE difficulty LIKE :level")
    fun getLessonsByDifficulty(level: Int): List<Lesson>
}

以及应用程序启动的代码:

class SplashscreenViewModel(
    private val repository: LessonRepository,
    private val lessonDao: LessonDao,
    val context: Context
) : BaseViewModel() {

    val nextScreenLiveData = MutableLiveData<Boolean>()

    override fun start() {

        ioScope.launch {

            val lessons = repository.getLessons().filter {
                it.site.contains("website")
            }.filter {
                DataUtils.isANumber(it.id)
            }

            lessonDao.insertLessons(lessons)
            nextScreenLiveData.postValue(true)
        }
    }

    override fun stop() {
    }
}

我的一个问题是,如果我更新应用程序,我想Room.databaseBuilder会再次被调用。但是,如果数据库的名称与前一个相同,会发生什么情况呢?它会恢复旧的,还是创建一个新的?覆盖旧的?

我有另一个问题,在插入查询中,它说onConflictStrategy.IGNORE. 但是当我将一个列表作为参数传递时,如果一些条目已经在数据库中而有些则没有,会发生什么?它会忽略所有这些吗?只是已经存在的吗?

谢谢你。

编辑:我安装了 Android-Debug-Database (https://github.com/amitshekhariitbhu/Android-Debug-Database),看起来数据库实际上很好。唯一的问题是,当我更新应用程序时,我插入的新条目会在查询结束时返回SELECT * FROM table。所以我尝试按 ID 对它们进行排序,它似乎有效。

4

0 回答 0