繁体   English   中英

如何在房间数据库中预填充数据

[英]How to pre-populate data in Room Database

我正在通过 Java 教程开发联系人应用程序。 我能够将转换转换为 Kotlin,直到我开始遇到 AsyncTask 问题来预填充数据。

我确认我可以将数据从活动发送到 Room 数据库,但似乎没有来自预先填充的数据。

数据库

@Database(entities = [ContactEntity::class], version = 1, exportSchema = false)
abstract class ContactDatabase : RoomDatabase() {

    abstract fun getContactDao():ContactDao

    companion object{
        private var instance:ContactDatabase?=null

        @kotlin.UseExperimental(InternalCoroutinesApi::class)
        fun getInstance(context: Context): ContactDatabase {

            return instance?: synchronized(this){
                instance?: Room.databaseBuilder(context.applicationContext,
                    ContactDatabase::class.java, "contact_database")
                    .fallbackToDestructiveMigration()
                    .addCallback(roomCallBack)
                    .build()
            }
        }

        val roomCallBack = object: RoomDatabase.Callback(){
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
                instance?.let { PopulateDbAsyncTask(it).execute() }
            }

        }

        internal class PopulateDbAsyncTask(db: ContactDatabase) : AsyncTask<Void, Void, Void>(){

            val contactDao = db.getContactDao()
            override fun doInBackground(vararg p0: Void?): Void? {
                contactDao.insert(ContactEntity("Darot", "Tosin", "M", "Atlantic View", "08060085192", R.drawable.maleavatar))
                contactDao.insert(ContactEntity("Tola", "Folawo", "M", "Atlantic View", "08060085192", R.drawable.femaleavatar))
                contactDao.insert(ContactEntity("Aisha", "Monday", "M", "Atlantic View", "08060085192", R.drawable.femaleavatar))
                return null
            }
        }
    }
}

主要活动

class MainActivity : AppCompatActivity() {


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

//        val contacts:ArrayList<ContactEntity>

        val contacts = arrayOf(

            ContactEntity("Tola", "Folawo", "M", "Atlantic View", "08060085192", R.drawable.femaleavatar),
            ContactEntity("Aisha", "Monday", "M", "Atlantic View", "08060085192", R.drawable.femaleavatar),
            ContactEntity("Darot", "Tosin", "M", "Atlantic View", "08060085192", R.drawable.maleavatar)
        )

        val arrayList: ArrayList<String> = ArrayList<String>(5)
        var list: MutableList<ContactEntity> = mutableListOf<ContactEntity>()

        list.add(ContactEntity("Tola", "Folawo", "M", "Atlantic View", "08060085192", R.drawable.femaleavatar))
        list.add(ContactEntity("Aisha", "Monday", "M", "Atlantic View", "08060085192", R.drawable.femaleavatar))
        list.add(ContactEntity("Darot", "Tosin", "M", "Atlantic View", "08060085192", R.drawable.maleavatar))

        val contactList = ArrayList<ContactEntity>()

        contactList.addAll(list)


        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.setHasFixedSize(true)
        val adapter = ContactAdapter()
        recyclerView.adapter = adapter


        val contactViewModel = ViewModelProviders.of(this).get(ContactViewModel::class.java)
        contactViewModel.getAllContactsModel().observe(this, object:Observer<List<ContactEntity>>{
            override fun onChanged(t: List<ContactEntity>) {
                adapter.setContacts(t)
                Toast.makeText(applicationContext, "$t", Toast.LENGTH_LONG).show()
            }
        })
    }
}

从上面的代码中,我可以手动将数据填充到数据库中。 我哪里做错了?

除非读取或写入表,否则不会命中房间回调。 所以做“.build”从来没有真正命中回调。 因此,对此的一个简单解决方案是在构建表后直接开始和结束事务。

db.beginTransaction()
db.endTransaction()

这是一个类似堆栈溢出问题的链接,可以帮助您: Room Database force OnCreate callback

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM