【问题标题】:Check value of child in Firebase DB Java检查 Firebase DB Java 中子项的值
【发布时间】:2022-08-16 04:33:35
【问题描述】:

我正在尝试从我的数据库中选择数据,并且我想检查特定子节点的值是 1 还是 0。如果它有一个 1 那么我不想显示来自该特定用户的信息。如果它为零,那么我想显示来自该特定用户的信息。

我是在我正在研究的方法之上的一种方法中完成的(我遵循了这个答案How to get child of child value from firebase in android?),我让它工作没有问题。但是我不能对我的其他方法做同样的事情,我现在整天都在尝试。

截至目前,我得到的唯一结果是列表根本没有出现。有人可以帮帮我吗 ?

有效的方法:

private void getPosts() {

    followingList = new ArrayList<>();

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference(\"Video_Posts\");
    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            myPosts.clear();
            //followingList.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                Post post = snapshot.getValue(Post.class);
                if (followingList.isEmpty()) {

                    if (!post.getPublisher().equals(firebaseUser.getUid())) {

                        DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference(\"Users\");
                        DatabaseReference zone1Ref = zonesRef.child(post.getPublisher());
                        DatabaseReference zone1NameRef = zone1Ref.child(\"acc_closed\");

                        zone1NameRef.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                //Log.i(TAG, dataSnapshot.getValue(String.class));

                                if (dataSnapshot.getValue(String.class).equals(\"1\")) {

                                    //Toast.makeText(getContext(), \"Account closed\", Toast.LENGTH_SHORT).show();
                                } else if (dataSnapshot.getValue(String.class).equals(\"0\")) {

                                    //Toast.makeText(getContext(), \"Not closed.\", Toast.LENGTH_SHORT).show();

                                    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

                                    Query query = rootRef
                                            .child(\"Follow\")
                                            .child(firebaseUser.getUid())
                                            .child(\"following\")
                                            .child(post.getPublisher());

                                    ValueEventListener valueEventListener = new ValueEventListener() {
                                        @Override
                                        public void onDataChange(DataSnapshot dataSnapshot) {
                                            if (dataSnapshot.exists()) {
                                                //Do something
                                                Toast.makeText(getContext(), \"Following.\", Toast.LENGTH_SHORT).show();

                                            } else {
                                                //Do something else
                                                myPosts.add(post);
                                                Collections.shuffle(myPosts);
                                                //Toast.makeText(getContext(), \"Something.\", Toast.LENGTH_SHORT).show();
                                            }
                                        }

                                        @Override
                                        public void onCancelled(DatabaseError databaseError) {
                                        }
                                    };
                                    query.addListenerForSingleValueEvent(valueEventListener);
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                                //Log.w(TAG, \"onCancelled\", databaseError.toException());
                            }
                        });

                    } else if (myPosts == null) {
                        Toast.makeText(getContext(), \"Nothing.\", Toast.LENGTH_SHORT).show();
                    }

                } else {
                    Toast.makeText(getContext(), \"List is not empty.\", Toast.LENGTH_SHORT).show();

                    for (String id : followingList) {

                        assert post != null;
                        if (!post.getPublisher().equals(id)) {
                            myPosts.add(post);
                            Toast.makeText(getContext(), \"Something.\", Toast.LENGTH_SHORT).show();

                        } else if (myPosts == null) {
                            Toast.makeText(getContext(), \"Nothing.\", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }

            adapterExplorer.notifyDataSetChanged();
            progressBar.setVisibility(View.GONE);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        }
    });
}

无效的方法:

private void searchUsers(String s) {

    Query query = FirebaseDatabase.getInstance().getReference(\"Users\");

    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if (search_bar.getText().toString().equals(\"\")) {
                recyclerView.setVisibility(View.INVISIBLE);
            }

            mUsers.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                User user = snapshot.getValue(User.class);

                DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference(\"Users\");
                DatabaseReference zone1Ref = zonesRef.child(user.getId());
                DatabaseReference zone1NameRef = zone1Ref.child(user.getAcc_closed());

                //mUsers.add(user);
                zone1NameRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapS) {

                        if (snapS.getKey().equals(\"1\")) {

                        } else if (snapS.getKey().equals(\"0\")){

                            //if (!snapS.exists()) {
                                Log.d(\"TAG\", snapS.toString());
                                mUsers.add(user);
                            //}
                        }
                        //}
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                        Log.d(\"Error name\", error.getMessage());
                    }
                });
            }

            userAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

            Log.d(\"Error name\", error.getMessage());
        }
    });
}

数据库:

\"Users\": {
\"4mFQt8Lf3CTNrQF74sy8wwyFoLh1\": {
  \"acc_closed\": \"0\",
  \"bio\": \"\",
  \"dateAdded\": \"19-06-2022 17:28:56\",
  \"date_time\": 1655674136805,
  \"device_token\": \"feGjHNzaR7S8yaV2HKg0rt:APA91bEXAiYwT52niHVxR2ENrcaKXSNs11Z5ss-g2gsDwTs4wbjqjcrN4ZUmemqiMzp6SZM6UXD5TFrc1JND_DoEgd-Ni9wMeCa73EzvKBAaj5aXJf1GjgjSsTVwBg1A6VvhvVwF1VSX\",
  \"fullname\": \"Brandon\",
  \"id\": \"4mFQt8Lf3CTNrQF74sy8wwyFoLh1\",
  \"imageurl\": \"https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/default.jpg?alt=media&token=befece91-9248-45ee-ab6f-b1b3d217c6b4\",
  \"username\": \"bran1\",
  \"verified\": \"false\"
},

编辑:

上面的代码 (searchUsers) 很有效。当我将文本放入搜索栏中时,没有任何显示。但是当我点击后退按钮并移除键盘时,数据就会显示出来。这就像我实际上在等待数据改变。

  • 这段代码中究竟有什么不能按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?
  • @AlexMamo 我不知道我没有得到任何错误或任何东西,但第二种方法不起作用。我期待它给我一个未删除其帐户 acc_closed == \"1\" 的用户列表,但它没有向我显示任何用户
  • 你怎么知道你没有得到错误?所以首先,不要再忽视他们了。请至少添加Log.d(TAG, error.getMessage());。您是否在 logcat 中打印了一些内容?
  • @AlexMamo 没有,还是什么都没有。
  • 嘿@HisR.H ???? Stack Overflow 是一个出了名的低效交互式调试器,因此如果您自己进行调试然后编辑问题(下面有一个链接)以显示您得到的结果,我们很可能可以提供帮助。所以:显示更新后的onCancelled,这样我们就可以看到您现在处理错误(正如 Alex 建议的那样),并在其他代码中添加更多 Log 调用,以查看执行的内容和不执行的内容,以及所有值 (重要)参数有。有了这些,我们中的一个人更有可能提供帮助。

标签: java firebase firebase-realtime-database


【解决方案1】:

简单的解决方法是您应该致电notifyDataSetChanged您修改了适配器显示的数据,现在您在此之前调用它。

因此,将呼叫 userAdapter.notifyDataSetChanged() 移动到 mUsers.add(user) 之后:

Query query = FirebaseDatabase.getInstance().getReference("Users");

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (search_bar.getText().toString().equals("")) {
            recyclerView.setVisibility(View.INVISIBLE);
        }

        mUsers.clear();
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            User user = snapshot.getValue(User.class);

            DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference("Users");
            DatabaseReference zone1Ref = zonesRef.child(user.getId());
            DatabaseReference zone1NameRef = zone1Ref.child(user.getAcc_closed());

            zone1NameRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapS) {

                    if (snapS.getKey().equals("1")) {

                    } else if (snapS.getKey().equals("0")){
                        Log.d("TAG", snapS.toString());
                        mUsers.add(user);
                        userAdapter.notifyDataSetChanged(); // ?
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    Log.d("Error name", error.getMessage());
                }
            });
        }
    }

这里还有更多(但与问题无关)的优化空间,因为您在最外面的侦听器中获得的dataSnapshot 已经包含 *alldata under/Users 的数据。

因此,无需添加其他侦听器即可为每个用户获取 acc_closed 值。相反,您可以像这样导航初始快照:

Query query = FirebaseDatabase.getInstance().getReference("Users");

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (search_bar.getText().toString().equals("")) {
            recyclerView.setVisibility(View.INVISIBLE);
        }

        mUsers.clear();
        for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
            DataSnapshot snapS = userSnapshot.child("acc_closed");
            String accClose = snapS.getValue(String.class)
            if (accClose.equals("0")){
                Log.d("TAG", accClose);
                mUsers.add(userSnapshot.getValue(User.class));
                userAdapter.notifyDataSetChanged();
            }
        }
    }

最后:您的代码检索所有/Users,然后仅使用acc_close 等于"0" 的用户。这会浪费(您和您的用户的)带宽,尤其是在您添加更多用户时。 use a query 最好只从服务器/数据库中检索必要的数据:

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("Users");
Query query = usersRef.orderByChild("acc_closed").equalTo("0");

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (search_bar.getText().toString().equals("")) {
            recyclerView.setVisibility(View.INVISIBLE);
        }

        mUsers.clear();
        for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
            mUsers.add(userSnapshot.getValue(User.class));
        }
        userAdapter.notifyDataSetChanged();

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2015-08-31
    • 2017-04-30
    • 1970-01-01
    • 2018-07-17
    • 2020-07-26
    相关资源
    最近更新 更多