2017-06-29 129 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() 
}