2

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

1. Room DB 数据未插入 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
}

}

4

1 回答 1

2

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

首先,确认问题是在Inserting中还是在 UI 中显示

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

其次,确认Adaper和ViewHolder是否合适。

  1. 您可以确认您的适配器和 ViewHolder 工作正常,只需从模拟器中拉出数据库,然后用一些示例数据填充它并将数据库推回模拟器。
于 2018-09-09T17:56:58.450 回答