База данных комнаты Android Данные не вставляются? - PullRequest
0 голосов
/ 09 сентября 2018

Я вставляю данные в базу данных комнаты, полученную из сети.Он не показывает никаких ошибок, и ни одно из приложений не падает, но экран пуст и таблица пуста. Все работает нормально, но когда я использую Stetho Debug Tool и смотрю на таблицу фидов ничего не вставлено, может кто-нибудь понятьэто и поможет мне.А также посмотреть, правильно ли реализованы 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
}

}

1 Ответ

0 голосов
/ 09 сентября 2018

Я публикую это в разделе ответов, потому что это слишком много для раздела комментариев.

Сначала убедитесь, что проблема в Вставка или в , отображаемая в интерфейсе пользователя .

  1. Stetho Debug Tool иногда не работает, особенно когда ROOM находится в режиме WAL. Поэтому запустите ваше приложение в эмуляторе, затем используйте «Диспетчер устройств» и извлеките БД, и посмотрите, вставлены ли записи. Если вы используете Room в режиме WAL, то вы заметите несколько файлов в дополнение к БД. Вам также нужно извлечь это, чтобы увидеть полную БД.
  2. Если вставка - ваша проблема, то вам нужно сосредоточиться на этом. Ниже приведены некоторые места для поиска:
    1. Проверьте, вызван ли метод insert.
    2. Проверьте, вызывается ли insert метод с правильной подачей
    3. Проверьте, вызывается ли insert метод из не-пользовательского потока

Во-вторых, проверьте правильность Adaper и ViewHolder.

  1. Вы можете подтвердить, что ваш адаптер и ViewHolder работают отлично, просто извлекая БД из эмулятора, а затем заполняя ее некоторыми примерами данных и отправляя БД обратно в эмулятор.
...