来自资产的Android Room Copy数据库未在版本更新时升级

时间:2019-02-13 16:21:54

标签: android kotlin android-room

我正在应用中使用Android Room。我有一个需要使用的资产预建数据库。每次更新版本时,我都需要用新数据库替换旧数据库。为此,我已使用常规文件IO复制了数据库。

private fun copyDatabaseFile(context: Context) {
    val dbPath = context.getDatabasePath(DB_NAME)
    if (dbPath.exists() && AppPrefs.getInstance().dataBaseVersion== DATABASE_VERSION) {
        return
    }
    if(dbPath.delete())Log.e("datacopy", "file deleted")

    dbPath.parentFile.mkdirs()
    try {
        val inputStream = context.assets.open("databases/no_database.db")
        val output = FileOutputStream(dbPath)
        val buffer = ByteArray(8192)
        var length =0
        while ({length = inputStream.read(buffer, 0, 8192); length}() > 0) {
            Log.e("datacopy", "Write")
            output.write(buffer, 0, length)
        }
        output.flush()
        output.close()
        inputStream.close()
        AppPrefs.getInstance().dataBaseVersion= DATABASE_VERSION
    } catch (e: IOException) {
        e.printStackTrace()
    }
}
}

这是数据库实例的吸气剂:-

 internal fun getDatabase(context: Context): MyDatabase? {
        if (INSTANCE == null) {
            synchronized(MyDatabase::class.java) {
                if (INSTANCE == null) {
                    copyDatabaseFile(context)
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        MyDatabase::class.java, DB_NAME)
                        .addMigrations(MyDatabase.MIGRATION_1_2)
                        .build()
                }
            }

        }
        return INSTANCE
    }

迁移现在为空,因为我需要擦除旧的副本和新的副本。所以我认为不需要迁移。

@JvmField
    val MIGRATION_1_2: Migration = object : Migration(1, 2) {
        override fun migrate(database: SupportSQLiteDatabase) {


        }
    }

第一次,一切正常。升级数据库版本时,我正在删除旧文件,复制新文件,但是Room返回了旧数据。 我不确定是什么问题。

我什至尝试了一些较旧的答案,提示:

  1. How to use Room Persistence Library with pre-populated database?带有预填充数据库的库

  2. https://github.com/humazed/RoomAsset

还尝试了Git的其他一些方法,但是没有一个起作用。 可能是什么问题?我需要的是每次数据库版本升级时都用新数据库替换旧数据库。

0 个答案:

没有答案