Перенос приложения Android из SQLiteOpenHelper в комнату - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь перенести базу данных моего приложения с 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)
...