2017-06-29 72 views
0

我基本上有許多用戶可以讀取(但不能寫入)的條目列表。這些項目根據每個條目具有的唯一整數在應用程序中顯示。我想添加一種方法來允許每個用戶最喜歡這些項目的x個,使這些x項目首先出現在列表中。有沒有一種方法可以使用Firebase的查詢來實現這一點,而不必爲每個用戶複製列表?Firebase數據庫查詢設計

+1

只有一半的解決方案,但你可以在每個用戶下存儲用戶的最愛,隨時保存條目列表,然後在客戶端有自定義的排序功能,按照用戶喜好排序,其次是唯一的整數。 – David

回答

0

而不是使用FirebaseRecyclerAdapter,只是傳遞查詢(這是我以前做的),我不得不手動管理結果,並使用RecyclerView.Adapter來代替。這是我結束的代碼。所以,如果他們已經在那裏和更新和諸如此類的東西其實是將項目我清理了一下,但這是必要的做法的快速摘要:

val data = ArrayList<SomeData> 
val favorites = ArrayList<Favorite> 
val dataWithFavorites = ArrayList<SomeData> 

private val dbRef : DatabaseReference by lazy { FirebaseDatabase.getInstance().reference } 
private val dataQuery : Query by lazy { dbRef.child("data").orderByChild("rank") } 
private val favoritesQuery : Query by lazy { dbRef.child("users").child("$someUserId").child("favorites").orderByChild("name") } 

init { 
    dataQuery.addValueEventListener(object : ValueEventListener { 
     override fun onCancelled(p0: DatabaseError?) { } 

     override fun onDataChange(p0: DataSnapshot?) { 
      data.clear() 
      p0!!.children.mapTo(dataList) { it.getValue(SomeData::class.java)!! } 
      updateEntries()  
     } 
    }) 

    favoritesQuery.addValueEventListener(object : ValueEventListener { 
     override fun onCancelled(p0: DatabaseError?) { } 

     override fun onDataChange(p0: DataSnapshot?) { 
      favorites.clear() 
      p0!!.children.mapTo(dataList) { it.getValue(Favorite::class.java)!! } 
      updateEntries()  
     } 
    }) 
} 

private fun updateEntries() { 
    if (data.isEmpty()) { 
     return 
    } 
    val favoritesStrings = favorites.map { (id) -> id } 
    val favoriteData = data 
      .filter { favoritesStrings.contains(it.id) } 
      .sortedBy { it.name } 
      .onEach { it.isFavorite = true } 
    dataWithFavorites.clear() 
    dataWithFavorites.addAll(data) 
    dataWithFavorites.removeAll(favoriteData) 
    dataWithFavorites.forEach { it.isFavorite = false } 
    dataWithFavorites.addAll(0, favoriteData) 
    recyclerView.adapter?.notifyDataSetChanged() 
}