Я пытаюсь перенести базу данных моего приложения с SQLiteOpenHelper
на RoomDatabase
, но так как мой проект огромен, я хочу делать это постепенно, не нарушая все (потому что база данных используется везде). В моей базе данных есть 3 таблицы: files
, sharedFiles
и unuploadedFiles
, я хочу перенести только unuploadedFiles
для использования комнаты
У меня два вопроса :
Может ли это на самом деле работать? Могу ли я использовать SQLiteOpenHelper и RoomDatabase вместе с одной и той же базой данных?
Моя текущая версия базы данных - 8, когда я перехожу на Room, должна ли моя миграция быть с 8 до 9 или с 1 до 2?
Вот код:
Какой у меня класс dbHelper, который выполняет запросы к базе данных
class DBHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 8;
private static final String DATABASE_NAME = "FilesDatabase";
private static final String TABLE_FILES = "files";
private static final String TABLE_SHARED = "sharedfiles";
private static final String TABLE_UNUPLOADED = "unuploadedfiles";
...
}
теперь я добавил FilesDatabase, который реализует RoomDatabase
@Database(entities = [(UnuploadedFile::class)], version = 2)
abstract class FilesDatabase : RoomDatabase() {
abstract fun unuploadedFileDao(): UnuploadedFileDao
companion object {
private val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
}
}
@Volatile
@JvmStatic
private var INSTANCE: FilesDatabase? = null
fun getInstance(context: Context): FilesDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
FilesDatabase::class.java, "FilesDatabase.db")
.addMigrations(MIGRATION_1_2)
.build()
}
}
и мой LocalFilesDataSource содержит UnuploadedFileDao и старый dbHelper
class LocalFilesDataSource(context: Context,
private val unuploadedFileDao: UnuploadedFileDao) : FilesDataSource {
companion object {
private var INSTANCE: LocalFilesDataSource? = null
@JvmStatic
fun getInstance(context: Context, unuploadedFileDao: UnuploadedFileDao): LocalFilesDataSource {
val result = INSTANCE ?: LocalFilesDataSource(context, unuploadedFileDao)
INSTANCE = result
return result
}
}
private val dbHelper: DBHelper = DBHelper(context)
...
}
и теперь, когда я хочу сделать запросы к таблице unuploadedFiles, я вызываю методы UnuploadedFilesDao:
override fun addUnuploadedFile(userName: String, fileName: String) {
unuploadedFileDao.insertUnuploadedFile(UnuploadedFile(userName, fileName))
}
и когда я хочу сделать запросы к другим таблицам, я вызываю dbHelper:
override fun insertFile(path: String?, filename: String?, serverModifiedDate: Date?, localModDate: Date?): Long =
dbHelper.insertFile(path, filename, serverModifiedDate, localModDate)