Android Room 数据库数据未插入?

标签 android kotlin android-room android-jetpack android-paging

我正在将数据插入从网络接收的房间数据库中。 它没有显示任何错误,应用程序也没有崩溃,但屏幕是空的,表格是空的 一切正常,但是当我使用 Stetho 调试工具并查看提要表时,没有插入任何内容,任何人都可以弄清楚并帮助我。还要查看 PageListAdapter 和 LivePageListBuilder 是否正确实现?

1.房间数据库数据未插入 2.分页实现

这就是道法

//Post feed item
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(feed:feed)

存储库类:

class FeedRepository (
    private val feedDao: FeedDao
){


private var lastRequestedItem = 0
private var isRequestInProgress = false
var executor = Executors.newSingleThreadExecutor()
companion object {
    lateinit var feedList:List<Feed>
    private const val DEFAULT_NETWORK_PAGE_SIZE = 50
    private const val DEAULT_DATABASE_PAGE_SIZE = 20
    private val apiClient = ApiClient.getApiClient().create(UserClient::class.java)
    // For Singleton instantiation
    @Volatile private var instance: FeedRepository? = null

    fun getInstance(feedDao: FeedDao) =
            instance ?: synchronized(this) {
                instance ?: FeedRepository(feedDao).also { instance = it }
            }
}


fun showFeed():LiveData<PagedList<feed>>{
    Timber.d("showFeed() method called")
    val dataSourceFactory = feedDao.getAllFeed()
    val boundaryCallback = FeedBoundaryCallBack(id = lastRequestedItem)
    val builder = LivePagedListBuilder(dataSourceFactory, DEAULT_DATABASE_PAGE_SIZE)
            .setBoundaryCallback(boundaryCallback)
            .build()
    return builder

}

public fun getFeedResponse() {
    Timber.i("getFeedResponse()")
    if(isRequestInProgress) return
    isRequestInProgress = true
    val call: Call<FeedResult> = apiClient.getFeed(DEFAULT_NETWORK_PAGE_SIZE,lastRequestedItem)
    call.enqueue(object :Callback<FeedResult>{
        override fun onFailure(call: Call<FeedResult>?, t: Throwable?) {
            Timber.d(t.toString())
        }

        override fun onResponse(call: Call<FeedResult>?, response: Response<FeedResult>?) {
            if(response!!.isSuccessful){
                //lastRequestedItem += response?.body()!!.size
                feedList = response?.body()!!.feedList
                for (i in feedList){
                    var name = i.username
                    var media = i.mUrl
                    var loc = i.location
                    var like = i.likesCount.toString()
                    var timeStamp = i.timeStamp
                    var id = i.id.toLong()
                    var res:feed = feed(id,name,media,timeStamp,loc,like)
                    addResponseTODB(res)
                }
                Timber.i("Successful Response -> Adding to DB")
                isRequestInProgress = false
            }else{
                when(response.code()){
                    400 -> Timber.d("Not Found 400")
                    500 -> Timber.d("Not logged in or Server broken")
                }

            }

        }
    })
}

private fun addResponseTODB(items:feed) ={
    executor.execute( {feedDao.insert(items)})
    Timber.d("Feed object Inserted into Database")
}

适配器和ViewHolder:

class FeedAdapter : PagedListAdapter<feed,FeedAdapter.ViewHolder> 
   (FeedDiffCallBack()){
  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
  ViewHolder {
    return ViewHolder(
            LayoutInflater.from(parent.context)
                    .inflate(R.layout.feedrow,parent,false)
    )
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val feedItem = getItem(position)
    if(feedItem != null){
        holder.bind(feedItem)
    }
}

class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) {
    //Retrieve data
    private val username:TextView = itemView.findViewById(R.id.username_txt)
    private val userPic:ImageView = itemView.findViewById(R.id.feedImage)
    private val location:TextView = itemView.findViewById(R.id.postLocation)
    private val time:TextView = itemView.findViewById(R.id.postTime)
    private val post:ImageView = itemView.findViewById(R.id.postImage)

    fun bind(feed: feed) = with(itemView){
        //TODO:Bind Data with View
        if(feed == null) {
            post.visibility = View.GONE
        }
        else{
            showFeedData(feed)
        }

    }

    private fun showFeedData(feed: feed) {
        username.text = feed.username
        userPic.setImageURI(null)
        userPic.visibility = View.GONE
        location.text = feed.location
        time.text = feed.timeStamp.toString()
        post.setImageURI(Uri.parse(feed.mUrl))

    }

}

}

class FeedDiffCallBack : DiffUtil.ItemCallback<feed>() {
override fun areItemsTheSame(oldItem:feed, newItem: feed): Boolean {
    return oldItem?.id == newItem?.id
}

override fun areContentsTheSame(oldItem: feed, newItem: feed): Boolean {
    return oldItem == newItem
}

}

最佳答案

我将其发布在答案部分,因为它对于评论部分来说太多了。

First, confirm whether the issue is in Inserting or in showing in UI.

  1. Stetho 调试工具有时无法工作,尤其是当 ROOM 处于 WAL 模式时。因此,在模拟器中运行您的应用程序,然后使用“设备管理器”并提取数据库,并查看是否插入了条目。如果您在 WAL 模式下使用 Room,那么您会注意到除了 DB 之外还有几个文件。您还需要提取它才能查看完整的数据库。
  2. 如果插入是您的问题,那么您需要关注这一点。以下是一些需要寻找的地方:
    1. 检查是否调用了insert方法。
    2. 检查是否使用正确的 feed 调用了 insert 方法
    3. 检查是否从非 UI 线程调用 insert 方法

Second, confirm if Adaper and ViewHolder is proper.

  • 您可以确认您的 Adapter 和 ViewHolder 是否正常工作,只需从模拟器中提取数据库,然后用一些示例数据填充它,然后将数据库推回模拟器即可。
  • 关于Android Room 数据库数据未插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244150/

    相关文章:

    android - 从 android Webview 中托管的网站获取用户登录详细信息

    java - onSaveInstanceState 给我 parcelable 错误...有时

    java - Android Studio,缺少android.support.annotation包

    kotlin - 如何使用属性实现抽象getter

    android - Room @Relation 与复合主键

    android - 如何在 Android TV 上移动网格项?

    Android:如何根据 API 的版本进行编码?

    kotlin - 判断reified类型是否可以为空

    android - 刷新 fragment 回到上一个 fragment

    java - 在 Android 上插入数据库之前,如何检查 Room 数据库中是否存在数据?