我正在将数据插入从网络接收的房间数据库中。 它没有显示任何错误,应用程序也没有崩溃,但屏幕是空的,表格是空的 一切正常,但是当我使用 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.
- Stetho 调试工具有时无法工作,尤其是当 ROOM 处于 WAL 模式时。因此,在模拟器中运行您的应用程序,然后使用“设备管理器”并提取数据库,并查看是否插入了条目。如果您在 WAL 模式下使用 Room,那么您会注意到除了 DB 之外还有几个文件。您还需要提取它才能查看完整的数据库。
- 如果插入是您的问题,那么您需要关注这一点。以下是一些需要寻找的地方:
- 检查是否调用了
insert
方法。 - 检查是否使用正确的 feed 调用了
insert
方法 - 检查是否从非 UI 线程调用
insert
方法
- 检查是否调用了
Second, confirm if Adaper and ViewHolder is proper.
- 您可以确认您的 Adapter 和 ViewHolder 是否正常工作,只需从模拟器中提取数据库,然后用一些示例数据填充它,然后将数据库推回模拟器即可。
关于Android Room 数据库数据未插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244150/