Firebase数据库查询设计
我基本上有许多用户可以读取(但不能写)的条目列表。 这些项目显示在应用程序基于每个条目具有唯一的整数排序。 我想添加一种方法来允许每个用户喜欢一些x这些项目,使这些x项目首先出现在列表中。 有没有一种方法,我可以实现这一点使用firebase的查询,而不必为每个用户复制列表?
而不是使用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() }