【问题标题】:Firebase database retreiving value, is this possibleFirebase 数据库检索值,这可能吗
【发布时间】:2018-05-22 20:24:22
【问题描述】:

我有这个代码:

DatabaseReference mdatabase = FirebaseDatabase.getInstance().getReference("allmessages");
        mdatabase.child(mAuth.getCurrentUser().getUid()).child(userID).child(uploadID).push().setValue("somevalue");

然后在另一个班级我有这个代码:

DatabaseReference mdatabase = FirebaseDatabase.getInstance().getReference("allmessages");
 mdatabase.child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //Loop through all files in Uploads DataBase
            for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){
                AllChatMessagesGet allChatMessagesGet = postSnapshot.getValue(AllChatMessagesGet.class);

我是否可以通过上面使用的代码获得mdatabase.child(mAuth.getCurrentUser().getUid()).child(userID).child(uploadID).push().setValue("somevalue"); 下的所有值。

因为它没有找回我的任何东西。我认为addValueEventListener 中的上述代码将通过mAuth.getCurrentUser().getUid() 的所有子类并为我检索“somevalue”。

但事实并非如此。那么如何检索“somevalue”。还有其他方法吗?因为代码是在不同的类中编写的,我不知道如何获取 .Child(userID).Child(uploadID) 这对我来说会是个问题。

无论如何,我是否可以检索mdatabase.child(mAuth.getCurrentUser().getUid()) 的所有孩子及其下方存在一些child 的值。

【问题讨论】:

  • 请添加您的数据库结构并指明您要获取的数据。
  • 我已经添加了数据库结构的图片
  • 您在问:“无论如何,我是否可以检索 mdatabase.child(mAuth.getCurrentUser().getUid()) 的所有孩子及其值(哪些值?),它们存在于下面的某个孩子(哪个孩子?)它。”。请注明您想要获得的确切值。
  • 好吧对不起,如果我不清楚。 AllChatMessages 的 2 个孩子是 userUid。我想打电话给mdatabase.child(mAuth.getCurrentUser().getUid()),并以某种方式获得以LD6开头的孩子的价值。等于mdatabase.child(mAuth.getCurrentUser().getUid()).child(userID).child(uploadID).push().setValue("somevalue");中的“somevalue”@
  • 有一种方法但是更好地理解,“获取以LD6开头的childs的值”是什么意思?你想通过调用mdatabase.child(mAuth.getCurrentUser().getUid())列出所有这些ID?

标签: java android firebase firebase-realtime-database


【解决方案1】:

根据您的 cmets,要获取那些在 -LCzWNw0nlC3GKsnPH8B 节点下仅使用 rootRef.child("AllChatMessages").child(uid)-LD 开头的 id,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("AllChatMessages").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            for(DataSnapshot dSnapshot : ds.getChildren()) {
                for(DataSnapshot snap : dSnapshot.getChildren()) {
                    String key = snap.getKey();
                    Log.d("TAG", key);
                }
            }
        }
    }

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

输出将是您正在寻找的所有这些 ID。

【讨论】:

    【解决方案2】:

    添加并实现ChildEventListener 而不是ValueEventListener。 您的“某个值”应该在被覆盖的 onChildChanged 方法的 DataSnapshot 中。

    【讨论】:

    • 我从上面复制了我的代码并尝试将其添加到 onChildChanged 和 onChildAdded 中,但均未成功,在日志中均返回 null
    【解决方案3】:

    我已经写了一个代码,它在下面的代码中。我所做的是从用户节点中获取价值。我已经通过下面的代码收回了它的所有孩子,你也可以尝试同样的方式,也许它会对你有所帮助。

    mFirebaseUserReference = FirebaseDatabase.getInstance().getReference();
     userReference = mFirebaseUserReference.child("Users");
    
            childEventListener = new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    Log.d("Values",dataSnapshot+"");
                    HashMap temp = (HashMap) dataSnapshot.getValue();
                    if (temp!=null){
                        if (!temp.get("id").equals(FirebaseAuth.getInstance().getCurrentUser().getUid())){
                            SignInModel signInModel = new SignInModel();
                            signInModel.setPhotoUrl((String)temp.get("photoUrl"));
                            signInModel.setEmail((String)temp.get("email"));
                            signInModel.setName((String)temp.get("name"));
                            signInModel.setId((String)temp.get("id"));
                            arrayList.add(signInModel);
                            adapter.notifyDataSetChanged();
                        }
                    }
                }
    
                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
    
                }
    
                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
            };
    
            userReference.addChildEventListener(childEventListener);
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2018-04-17
      • 1970-01-01
      相关资源
      最近更新 更多