【问题标题】:Observe Data from Room using View model in Kotlin在 Kotlin 中使用 View 模型观察 Room 中的数据
【发布时间】:2018-09-08 08:39:53
【问题描述】:

我正在创建一个社交媒体应用程序,我正在关注 MVVM Pattern 我被困在来自 DB 的 observing 数据上。据我所知,Dao 方法必须在后台thread 上执行。但是我无法从Repository Class 实现viewmodel。我将粘贴代码,有人可以帮我吗?

@Dao
interface FeedDao{

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

//Update feed item
@Update(onConflict = OnConflictStrategy.IGNORE)
fun update(feed: Feed):Int

//Get feed from user friend's
@Query("SELECT * from feed")
fun getAllFeed():LiveData<List<Feed>>
}

存储库

class FeedRepository private constructor(private val feedDao: FeedDao) {

companion object {
    @Volatile private var instance:FeedRepository? = null
    private val apiClient = ApiClient.getApiClient().create(UserClient::class.java)
    fun getInstance(feedDao: FeedDao)= instance?: synchronized(this){
      instance ?: FeedRepository(feedDao).also { instance=it }
     }
}


private fun getFeedResponse() {

    //TODO:Check to change parameter values after adding Paging Functionality
    val call: Call<List<Feed>> = apiClient.getFeed(20, 0)
    call.enqueue(object :Callback<List<Feed>>{
        override fun onFailure(call: Call<List<Feed>>?, t: Throwable?) {
            Log.e("FeedRepository","Feed Callback Failure")
            Timber.d(t?.message)
        }

        override fun onResponse(call: Call<List<Feed>>?, response: Response<List<Feed>>?) {
            if(response!!.isSuccessful){
                Timber.i("Successful Response -> Adding to DB")
                addResponseTODB(response.body()!!)
            }else{
                when(response.code()){
                    400 -> Timber.d("Not Found 400")
                    500 -> Timber.d("Not logged in or Server broken")
                }

            }

        }
    })
}

private fun addResponseTODB(items:List<Feed>){
    Timber.d("Response --> DB Started")
    object :  AsyncTask<List<Feed>,Void,Boolean>(){
        override fun doInBackground(vararg params: List<Feed>?): Boolean {
            var needsUpdate:Boolean = false
            for(item in params[0]!!.iterator()){
                var inserted = feedDao.insert(item)
                if(inserted.equals(-1)){
                    var updated = feedDao.update(item)
                    if(updated > 0){
                        needsUpdate = true
                    }
                }else{
                    needsUpdate = true
                }
            }
            return needsUpdate
        }

        override fun onPostExecute(result: Boolean?) {
            if (result!!){
                loadFromDB()
            }
        }

    }.execute(items)
}


private fun loadFromDB(){
    Timber.d("loadFromDB")

    object :AsyncTask<Void,Void,LiveData<List<Feed>>>(){
        override fun doInBackground(vararg params: Void?): LiveData<List<Feed>>? {
            return feedDao.getAllFeed()
        }

        override fun onPostExecute(result: LiveData<List<Feed>>?) {

        }
    }.execute()
}


public fun fetchFeed(){
    Timber.d("fetchFeed")
    loadFromDB()
    getFeedResponse()
}

}

视图模型

class FeedViewModel private constructor(private val 
feedDao:FeedDao):ViewModel(){
// TODO: Implement the ViewModel

private val feedRepository= FeedRepository.getInstance(feedDao)
public val feed = MediatorLiveData<List<Feed>>()
val value = MutableLiveData<Int>()
init {
        feed.addSource(feed,feed::setValue)
}

companion object {
    private const val NO_FEED = -1
}

fun getFeedLD() = feed

}

【问题讨论】:

  • 你能检查一下这个链接吗?我只是用谷歌搜索你的问题,我发现了这个。我认为这个链接到目前为止可以帮助你实现 ViewModel & Repository 类。medium.com/rocknnull/…

标签: android viewmodel android-room android-livedata android-jetpack


【解决方案1】:

首先,您不需要将所有Feed 对象一一插入Database 中。您可以在FeedDao 中创建一个方法来插入List&lt;Feed&gt;

@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(feed: List<Feed>):Long

然后,没有必要在onPostExecute() 方法中调用loadFromDB(),因为您的fun getAllFeed(): LiveData&lt;List&lt;Feed&gt;&gt;() 方法从@FeedDao 返回LiveData,您可以在每次数据时添加Observer数据库内部的更改将触发Observer

对于您的网络/数据库请求,您始终可以使用 NetworkBoundResource https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/repository/NetworkBoundResource.kt

希望我能以某种方式提供帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多