如何跳过迭代器以从父节点+子节点进行迭代?

时间:2019-04-22 21:30:26

标签: java android firebase firebase-realtime-database

因此,我正在使用Fire base设置列表视图。如果该父节点的子节点= =某些东西(即用户ID),我想在哪里打印父节点。我程序的父节点是日记名称,而此父节点的子节点是那些被允许访问该日记的用户的用户ID。现在,我要检查应用程序用户的ID是否与日记的任何子项匹配。如果子节点存在,则父节点的值将存储在哈希集中。

在这里,我共享了数据库图像的链接- https://photos.app.goo.gl/Wbvc7hanrVKRqBiM9

  • 首先,只是看不到ATMDusers节点就忘了它。
  • 现在在ATMD下方,您可以看到一些名称,例如父节点,即Dindori和Pimpalgaon,以及一些子节点,即与它们关联的用户ID。
  • 我想做的是一次迭代父节点,然后检查其子节点是否允许用户访问该父节点。
  • 如果是,则只需将父节点的名称添加到哈希集。
  • 如果不允许他去那个父级,则迭代到下一个父级并检查子节点。
  • 现在,我正在使用下面指定的代码在ATMDUsers节点中显示所有日记。
sortRef = FirebaseDatabase.getInstance().getReference().child("ATMDusers");
sortRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Set<String> set = new HashSet<>();
        Iterator iterator = 
        dataSnapshot.getChildren().iterator();
        while (iterator.hasNext()){
            set.add(((DataSnapshot)iterator.next()).getKey());
        }
        list_of_diaries.clear();
        list_of_diaries.addAll(set);
        arrayAdapter.notifyDataSetChanged();
    }
}

因此,我尝试首先迭代父节点,然后级联子节点以在其上迭代以返回日记名称,以将其添加到哈希集中,但是代码被弄乱了。

private void RetrieveAndDisplayDiaries() {
        sortRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                Iterator iterator = dataSnapshot.getChildren().iterator();

                while (iterator.hasNext()){
                    diaryName = ((DataSnapshot)iterator.next()).getValue().toString();
                    authorizedGroup();
                }
                /*list_of_diaries.clear();
                list_of_diaries.addAll(set);
                arrayAdapter.notifyDataSetChanged();*/
}

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

            }
        });
}

private void authorizedGroup() {
        sortRef.child(diaryName).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                set = new HashSet<>();
                Iterator verify = dataSnapshot.getChildren().iterator();

                while (verify.hasNext()) {
                    if (currentUserID == ((DataSnapshot)verify.next()).getKey()){
                       // set.add(diaryName);
                    }
                }
            }

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

            }
        });
}

但这没有帮助。 我想我在这里犯了一些大错误,请给我指出。

1 个答案:

答案 0 :(得分:0)

Answer

因此,在这里我不是创建一个新的父节点来仅比较该父节点中的用户存在,而是决定再添加一个与User节点的信息相关联的子节点。我现在正在做什么,我正在调用mAuth以获取用户的当前用户ID。那么我要迭代该userID的Access节点以在列表视图中打印该值。

Final output

正如您在img 2和img 3中看到的那样,有两个不同的片段,第一个用于编辑,第二个用于公众查看。现在,通过我的配置,我可以决定谁可以编辑我的xyz ...

Without comparison means anyone can see