使用parseSnapshot(DataSnapshot快照)根据子键过滤要在RecyclerView中填充的项目

时间:2017-02-26 11:34:00

标签: android firebase firebase-realtime-database firebaseui

我正在开发一种论坛类型的应用,用户可以在其中发布问题并使用相关技术对其进行标记。

该应用的模块和数据库与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部分返回什么。当前的其他部分会返回所有帖子。

与此相比,是否有更好的方法来过滤数据?

非常感谢任何帮助!

2 个答案:

答案 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。正如您在该问题中所看到的,这是一个有争议的功能。

作为Morgan says there

  

[FirebaseUI]过滤是故意的非目标,因为我们不想鼓励贪图拉取可能永远不会显示的数据。

我肯定害怕在您的方案中检索太多数据。想出一个允许在服务器上完成所需过滤的数据模型会好得多。