Android Room Prepopulate SQL база данных и постоянное обновление - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь использовать Kotlin для:
- предварительно заполнить базу данных комнат в моем приложении из существующей базы данных SQL.
- разрешить пользователю обновлять данные.
- разрешить сохраненным обновленным данным только для текущей версии.
- получить новую версию flu sh из старых данных и заменить их новыми SQL database.

Вот что я сделал до сих пор:
Я использовал createFromAsset метод для предварительного заполнения базы данных с помощью вызова fallbackToDestructiveMigration() следующим образом:

@Database(entities = [MCData::class], version = 1, exportSchema = false)
abstract class MyRoom : RoomDatabase() {
    abstract val myDao: MyDao

    companion object {

        @Volatile 
        private var INSTANCE: MyRoom? = null

        fun getInstance(context: Context): MyRoom {

            synchronized(this) {

                var instance = INSTANCE

                if (instance == null) {

                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        MyRoom::class.java,
                        "mcdata.db")
                        .createFromAsset("mydata.db")
                        .fallbackToDestructiveMigration()
                        .build()
                    INSTANCE = instance
                }

                return instance
            }
        }
    }

Это предварительно заполняет данные и позволяет пользователю изменять их, но обновления данных после первоначального заполнения теряются при перезапуске приложения. Я озадачен этим поведением, потому что похоже, что код использует fallbackToDestructiveMigration() для обновления sh данных, даже если схема не изменилась (пользователи могут изменять только значения двух существующих столбцов).

Если я удаляю метод fallbackToDestructiveMigration(), обновления пользователя после первоначального предварительного заполнения сохраняются, но при переустановке приложения с новыми данными база данных не обновляется.

Есть ли способ сохранить данные (включая изменения) в текущей версии, но заменить их новой базой данных SQL с предварительным заполнением при установке новой версии?

1 Ответ

0 голосов
/ 12 апреля 2020

В итоге я создал две функции компоновщика:
- первая вызывается при первой установке или обновлении программного обеспечения, которая считывает данные из базы данных ресурсов.
- Второй вызывается в другое время, который читает из локальной базы данных, поэтому небольшие версии настроек пользователя сохраняются для версии.

@Database(entities = [MCData::class,FBData::class,WhereAmIdata::class], version = 1, exportSchema = false)
abstract class MyRoom : RoomDatabase() {
    abstract val myDao: MyDao

    companion object {

        @Volatile // with volatile, changes immediately become visible to all threads
        private var INSTANCE: MyRoom? = null

        // this instantiaion is called the first time the software is updated
        fun getInstanceAfterSoftwareUpdate(context: Context): MyRoom {

            synchronized(this) {
                var instance = INSTANCE

                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        MyRoom::class.java,
                        "mcdata")
                        .createFromAsset("mydata.db")
                        .fallbackToDestructiveMigration()
                        .build()

                    INSTANCE = instance
                }
                return instance
            }
        }


        fun getInstance(context: Context): MyRoom {

            synchronized(this) {

                var instance = INSTANCE

                if (instance == null) {

                    Log.i("MyRoom", "reading locally")
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        MyRoom:: class.java,
                        "mcdata"
                    )
                        .fallbackToDestructiveMigration()
                        .build()

                    INSTANCE = instance
                }

                return instance
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...