Как добавить данные во вновь созданную базу данных комнат? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытался импортировать данные в методе onCreate:

    db = Room.databaseBuilder(applicationContext,
            AppDatabase::class.java,
            "my-database")
        .allowMainThreadQueries()
        //.fallbackToDestructiveMigration()
        .addCallback(object: RoomDatabase.Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                Log.d("RoomDatabase.Callback", "onCreate called")
                importData()
            }
        })
        .build()

, но это приводит к

IllegalStateException: getDatabase вызывается рекурсивно

Выполнение импорта после создания базы данных также не работает:

    var performInitialImport = false

    db = Room.databaseBuilder(applicationContext,
            AppDatabase::class.java,
            "my-database")
        .allowMainThreadQueries()
        //.fallbackToDestructiveMigration()
        .addCallback(object: RoomDatabase.Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                Log.d("RoomDatabase.Callback", "onCreate called")
                performInitialImport = true
            }
        })
        .build()

    Log.d("PerformInitialImport", "$performInitialImport")

    if (performInitialImport) {
        importData()
    }

, поскольку обратный вызов не выполняется до продолжения потока управления после построения базы данных. Это видно по тому факту, что

D / PerformInitialImport: false

предшествует

D / RoomDatabase.Callback: onCreate вызывает

в журнале запуска приложения.

Я потерян. Как мне импортировать данные в базу данных при первом создании?

Обновление: В методе importData используется экземпляр AppDatabase, созданный в первой строке. Параметр db, переданный в onCreate, является базовой базой данных низкого уровня. Естественно, я хочу использовать DAO и сущности, которые у меня уже есть для заполнения базы данных ...

1 Ответ

1 голос
/ 08 ноября 2019

Причина, по которой вы получаете поведение, состоит в том, что сборка не открывает базу данных, и только когда вы используете базу данных, она открыта, а затем, если база данных не существует, она будет создана и вызван onCreate. ,

Таким образом, executeInitialImport всегда будет false , если вы не обращаетесь к базе данных, что заставляет ее открываться.

Вам необходимо открыть (доступ)базы данных перед выполнением теста.

Пример: -

class MainActivity : AppCompatActivity() {

    var firstrun = false
    var myTableDao :MyTableDao? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("ROOMBUILD","Building Room Database")
        val db = Room.databaseBuilder(this,AppDatabase::class.java,"mydb")
            .allowMainThreadQueries()
            .addCallback(object: RoomDatabase.Callback()
            {
                override fun onCreate(db: SupportSQLiteDatabase) {
                    Log.d("ONCREATE","onCreate called.")
                    super.onCreate(db)
                    firstrun = true;
                }
            }
            )
            .build()
        Log.d("ROOMBUILD","Room database built")
        myTableDao = db!!.myTableDao()
        //myTableDao!!.getAll() //would also work assuming getAll is defined in the Dao
        db.openHelper.writableDatabase //<<<<<<<<<< Force open
        if (firstrun) {
            importData()
        }
         for (m in myTableDao!!.getAll()) {
             Log.d("MYTABLEINFO","Names is " + m.name + " ID is " + m.id)
         }
    }

    fun importData() {
        Log.d("IMPORTING","Data being imported")
        var mytable = MyTable()
        mytable.name = "MyData"
        myTableDao?.insert(mytable)
    }
}

Результаты

При установке: -

2019-11-08 10:36:18.629 D/ROOMBUILD: Building Room Database
2019-11-08 10:36:18.642 D/ROOMBUILD: Room database built
2019-11-08 10:36:18.664 D/ONCREATE: onCreate called.
2019-11-08 10:36:18.669 D/IMPORTING: Data being imported
2019-11-08 10:36:18.675 D/MYTABLEINFO: Names is MyData ID is 1

Последующие прогоны: -

2019-11-08 10:37:07.759 D/ROOMBUILD: Building Room Database
2019-11-08 10:37:07.772 D/ROOMBUILD: Room database built
2019-11-08 10:37:07.789 D/MYTABLEINFO: Names is MyData ID is 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...