我正在开发一种论坛类型的应用,用户可以在其中发布问题并使用相关技术对其进行标记。
该应用的模块和数据库与Firebase database repo类似。
我想根据标签过滤帖子。由于多个键值无法在服务器端进行过滤,因此我必须在填充RecyclerView之前尝试过滤它。
我在这里提到了很多问题,发现Puf的answer与此案有关。
这是我的JSON树
"posts" : {
"-Kdb0BsybfpPtkAPRF1-" : {
"author" : "Anush Surendran",
"body" : "Test 1 ",
"commentCount" : 0,
"created" : 1487787053303,
"starCount" : 1,
"stars" : {
"v9KTwyI2DMbDgKHALgPSJEBK3fi1" : true
},
"tag" : "#CSS",
"title" : "Checking Post Time",
"uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1"
},
"-Kdb2D9vD-3kHWpCMIFi" : {
"author" : "Anush Surendran",
"body" : "Abc",
"commentCount" : 0,
"created" : 1485000000000,
"starCount" : 0,
"tag" : "#HTML",
"title" : "Test 2",
"uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1"
}
我使用以下逻辑覆盖parseSnapshot
@Override
protected Post parseSnapshot(DataSnapshot snapshot) {
if (snapshot.getValue(Post.class).tag.equals("#HTML")){
Log.d(TAG,"gotHTML Filtered Posts");
return snapshot.getValue(Post.class);
}
else
return super.parseSnapshot(snapshot);
}
现在尝试使用一个值。我将它放在循环中以过滤多个标签(比如HTML,CSS,JS)
代码工作正常,我可以看到if条件按预期工作。
如果没有具有特定标记的帖子,我无法弄清楚在else部分返回什么。当前的其他部分会返回所有帖子。
与此相比,是否有更好的方法来过滤数据?
非常感谢任何帮助!
答案 0 :(得分:3)
您可以从firebase获取过滤后的数据,而不是获取所有数据并在客户端中对其进行过滤。
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
Query postsQuery = mDatabase.child("posts").orderByChild("tag").equalTo("#HTML");
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, postsQuery) {
@Override
protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position) {
final DatabaseReference yourRef = getRef(position);
viewHolder.bindToPost(model,getContext());
}
};
mRecycler.setAdapter(mAdapter);
答案 1 :(得分:1)
覆盖UnsafeCell<U>
可用于将视图映射到快照中的数据子集。如果不能用于过滤数据。
目前无法使用FirebaseUI过滤客户端上的数据。有一个开放功能请求:https://github.com/firebase/FirebaseUI-Android/issues/15。正如您在该问题中所看到的,这是一个有争议的功能。
[FirebaseUI]过滤是故意的非目标,因为我们不想鼓励贪图拉取可能永远不会显示的数据。
我肯定害怕在您的方案中检索太多数据。想出一个允许在服务器上完成所需过滤的数据模型会好得多。