迁移后,Android Room用新数据填充数据库吗?

时间:2019-07-16 20:37:28

标签: android database sqlite database-migration android-room

我已经在Play商店中发布了一个应用,该应用使用onCreate回调中的数据预填充了Room数据库。从JSON文件读取数据,并将其放入数据库中。一切都会再次将数据从JSON文件存储到数据库中(将新记录添加到表中)。

这是我的RoomDatabase create方法:

private fun create(context: Context): MyDatabase {
        val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE dogs ADD COLUMN language TEXT")
            }
        }
        return Room.databaseBuilder(
            context.applicationContext,
            MyDatabase::class.java,
            DB_NAME
        )
            .addMigrations(MIGRATION_1_2)
            // prepopulate the database after onCreate was called
            .addCallback(object : RoomDatabase.Callback() {
                override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)
                    GlobalScope.launch {
                        getInstance(context)?.let { DatabaseUtils.prepopulateDatabase(context, it) }
                    }
                }
            })
            .build()
    }

有没有一种简便的方法,而无需手动编写数百个SQL请求? 或者,如果有一种方法可以删除整个数据库并使用全新的数据创建一个新数据库,那么对我来说也许也是一种选择。

先谢谢大家;)

2 个答案:

答案 0 :(得分:0)

您可以使用fallbackToDestructiveMigration删除/清除以前的数据库。

database = Room.databaseBuilder(context.getApplicationContext(),
                    UsersDatabase.class, "Sample.db")
            .fallbackToDestructiveMigration()
            .build();

请参阅此Google文章Understanding migrations with Room

中的方案3

答案 1 :(得分:0)

也许这是最简单的方法:

private const val IS_DB_RECREATED = "is_database_recreated"

class App : Application(), HasActivityInjector {

    override fun onCreate() {
        super.onCreate()
        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        val isDBRecreated = sharedPreferences.getBoolean(IS_DB_RECREATED, false)

        if (!isDBRecreated) {
            deleteDatabase(MyDatabase.DB_NAME)
            sharedPreferences.edit().putBoolean(IS_DB_RECREATED, true).apply()
        }
    }
}

所有数据将从数据库中丢失,但是当第一次访问新数据库时,它将被预先填充,我也可以更改方案。