【问题标题】:Firebase Retrieve Current Child then Set as Child of another Child AndroidFirebase 检索当前子项,然后设置为另一个子项 Android 的子项
【发布时间】:2019-04-07 21:24:02
【问题描述】:

** 已编辑 **

我需要 Firebase 方面的帮助。我需要做的是:

  1. 在 Tokens 下创建一个名为 Tokens(与 Clients 和 Workers 一致)的新数据库引用;
  2. 根据当前用户(例如木匠、水管工或电工)的孩子创建另一个新的数据库引用

当前代码:

    FirebaseDatabase db = FirebaseDatabase.getInstance();

    DatabaseReference tokens = db.getReference(Common.token_table);

    Token token = new Token(FirebaseInstanceId.getInstance().getToken());
    //if user is already logged in, will update token
    tokens.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
            .setValue(token);

Current database

我需要这样:

See image

Updated Screenshot

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    要解决这个问题,您需要像这样获取经过身份验证的用户的uid

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    

    拥有此uid,您可以在活动中需要的任何地方使用它。所以要根据你的数据库结构添加tokenId,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    String tokenId = FirebaseInstanceId.getInstance().getToken();
    rootRef.child("Tokens").child("Carpenters").child(tokenId).setValue(true);
    

    您的数据库结构将如下所示:

    Firebase-root
        |
        --- Tokens
              |
              --- Carpenters
                      |
                      --- "uid1": true
    

    根据您的编辑,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    String tokenId = FirebaseInstanceId.getInstance().getToken();
    rootRef.child("Tokens").child("Plumbers").child(uid).child("token").setValue(tokenId);
    

    最终答案:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    String tokenId = FirebaseInstanceId.getInstance().getToken();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference workersRef = rootRef.child("Workers");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                if (ds.child(uid).exists()) {
                    rootRef.child("Tokens").child(ds.getKey()).child(uid).child("token").setValue(tokenId);
                }
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    workersRef.addListenerForSingleValueEvent(valueEventListener);
    

    【讨论】:

    • 嗨,亚历克斯!我做了你的代码,它在带有 Carpenters 的令牌下创建了一个新的孩子(如 .child("Carpenters")),即使用户不在 Carpenters 之下。我想我也可以把这个问题总结为“如何获取父节点”
    • 你能用数据库现在的样子来编辑你的问题吗?你希望它怎么样?你想找哪个父母,我不明白。
    • 嗨@alexmamo 我更新了这个问题。为混乱道歉。
    • 我现在明白了。请参阅我更新的答案。现在还好吗?
    • 你好,亚历克斯。看起来数据库中没有任何变化。它没有创建当前用户的父级(例如 Plumbers)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多