我对 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 对它们进行排序,它似乎有效。