首页 > 解决方案 > 未使用 RoomDB 插入多行数据

问题描述


当我尝试使用 Room 在 DB 中插入大约 400 行数据时,它只插入 90 行数据。请在下面找到我的代码:

@Entity(tableName = "data_info")
data class DataInfo(
        @PrimaryKey(autoGenerate = true) val uid: Int,
        val body: String?,
        val title:String?) {
}

数据信息道.kt

@Dao
 interface DataInfoDao{

@Transaction @Insert
fun insertAll(resultModel:MutableList<DataInfo> )
@Transaction @Query("SELECT * FROM data_info ORDER BY uid COLLATE NOCASE ASC")
fun allDataByName(): DataSource.Factory<Int, DataInfo>

}

DataInfoRoomDataBase.kt:

@Database(entities = arrayOf(DataInfo::class), version = 3)
abstract class DataInfoRoomDataBase : RoomDatabase() {

    abstract fun dataInfoDao(): DataInfoDao
    val context:Context?=null
    companion object {
        private var INSTANCE: DataInfoRoomDataBase? = null

        fun getDatabase(context: Context): DataInfoRoomDataBase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }
            synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    DataInfoRoomDataBase::class.java,
                    "datainfo_page_database"
                )   .fallbackToDestructiveMigration()
                    .addCallback(SRoomDatabaseCallback())
                    .build()
                INSTANCE = instance
                return instance
            }
        }

    }


   private class SRoomDatabaseCallback : RoomDatabase.Callback() {
       override fun onCreate(db: SupportSQLiteDatabase) {
           super.onCreate(db)
           /*PopulateDbAsyncTask(INSTANCE)
               .execute()*/
           fillInDb(INSTANCE)
       }
       private fun fillInDb(db: DataInfoRoomDataBase?) {
           // inserts in Room are executed on the current thread, so we insert in the background

           ioThread {
               db?.dataInfoDao()?.insertAll(prepareDummyData())

              /* db?.dataInfoDao()?.insertAll(
                   CHEESE_DATA.map{DataInfo(uid = 0, body="Info" , title = it)}.toMutableList())*/
           }
       }
       private fun prepareDummyData():MutableList<DataInfo>{
           val dummyList = mutableListOf<DataInfo>()
           for(i in 0..400){
               dummyList.add(DataInfo(uid = 0, body="Info" , title = "Title  $i"))
           }
           return  dummyList
       }

    }

在方法“prepareDummyData()”的上述代码中,我准备了 400 行的虚拟数据并尝试插入数据库。但是只有 90 条记录被插入。

我的视图模型如下:

class DataInfoViewModel(application: Application) : AndroidViewModel(application) {

    var allInfo: LiveData<PagedList<DataInfo>> = MutableLiveData()
    lateinit var dataInfoDao:DataInfoDao

     init{
         dataInfoDao = DataInfoRoomDataBase.getDatabase(application).dataInfoDao()
             allInfo = dataInfoDao.allDataByName().toLiveData(Config(pageSize = 30,
                 enablePlaceholders = true
                 ,maxSize = 200))
     }

    fun remove(dataInfo: DataInfo) = ioThread {
        dataInfoDao.delete(dataInfo)
    }
 }

请找到我的视图和适配器类如下:

class PagingRoomDataBaseFragment:Fragment() {

    var fragmentView: View? = null
   // private var listInfoAdapter:ListInfoAdapter?=null
    private var roomDbInfoListFragmentLayoutBinding:RoomDbInfoListFragmentLayoutBinding?=null
   // val dataInfoViewModel: DataInfoViewModel by lazy { ViewModelProviders.of(this).get(DataInfoViewModel::class.java) }
    var  mContainerID:Int = -1
    private val dataInfoViewModel by viewModels<DataInfoViewModel>()
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        roomDbInfoListFragmentLayoutBinding = DataBindingUtil.inflate(inflater, R.layout.room_db_info_list_fragment_layout, container, false)
        roomDbInfoListFragmentLayoutBinding?.lifecycleOwner = this
        fragmentView = roomDbInfoListFragmentLayoutBinding?.root
        container?.let{
            mContainerID =    container.id
        }

     //   fragmentView?.floatingActionButton?.visibility.apply { 8 }

           // initAdapter()
            intRecyclerView()
            setAdapter()
          //  initSwipeToDelete()

            //listInfoAdapter?.refreshList()
            return fragmentView

    }

    fun intRecyclerView(){
        fragmentView?.dbrecyclerView?.apply {
            layoutManager = LinearLayoutManager(activity)
            addItemDecoration(DividerItemDecoration(activity, DividerItemDecoration.VERTICAL))
        }
    }


    fun setAdapter(){
        val listInfoAdapter =
            ListInfoAdapter()
          //  dataInfoViewModel.allInfo.observe(this, Observer(listInfoAdapter::submitList))
            fragmentView?.dbrecyclerView?.adapter = listInfoAdapter
        dataInfoViewModel.allInfo.observe(this@PagingRoomDataBaseFragment.requireActivity(), Observer { data ->
                // Update the cached copy of the words in the adapter.

                data?.let {
                    //view.textView2.text = it.toString()
                    // Log.d("RoomDBFragment","ViewModel Observer is called")
                    Log.d("Fragm","it:::"+it.toString())
                    listInfoAdapter?.setAdapterList(it)
                }
            })

    }

适配器类:

class ListInfoAdapter : PagedListAdapter<DataInfo,ListInfoAdapter.ViewHolder>(diffCallback) {
    private var list: List<DataInfo> = emptyList<DataInfo>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        val binding: PageDbListItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.page_db_list_item, parent, false)
        return ListInfoAdapter.ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
       Log.d("ADapter", "Info:::$position" + list.get(position))
        holder.bind(list.get(position)/*getItem(position)*/)
    }

    fun setAdapterList(list: PagedList<DataInfo>) {
        this.list = list
        notifyDataSetChanged()
    }
    fun refreshList(){
        notifyDataSetChanged()
    }
    override fun getItemCount(): Int = list.size

    class ViewHolder(val binding: PageDbListItemBinding) : RecyclerView.ViewHolder(binding.root) {
        var data : DataInfo? = null
        fun bind(data: DataInfo?) {
            this.data = data
            binding.setVariable(BR.dataInfo, data) // BR - generated class; BR.item - 'item' is variable name declared in layout
            binding.executePendingBindings()
        }
    }

    companion object {
        /**
         * This diff callback informs the PagedListAdapter how to compute list differences when new
         * PagedLists arrive.
         * <p>
         * When you add a Cheese with the 'Add' button, the PagedListAdapter uses diffCallback to
         * detect there's only a single item difference from before, so it only needs to animate and
         * rebind a single view.
         *
         * @see android.support.v7.util.DiffUtil
         */
        private val diffCallback = object : DiffUtil.ItemCallback<DataInfo>() {
            override fun areItemsTheSame(oldItem: DataInfo, newItem: DataInfo): Boolean =
                oldItem.uid == newItem.uid

            /**
             * Note that in kotlin, == checking on data classes compares all contents, but in Java,
             * typically you'll implement Object#equals, and use it to compare object contents.
             */
            override fun areContentsTheSame(oldItem: DataInfo, newItem: DataInfo): Boolean =
                oldItem == newItem
        }
    }
}

标签: androidkotlinandroid-room

解决方案


推荐阅读