【问题标题】:Retrieving child value without knowing key value from Firebase realtime database在不知道 Firebase 实时数据库中的键值的情况下检索子值
【发布时间】:2019-02-21 17:55:14
【问题描述】:

我想获取“drinkManufacturerID”等于 currentUsers UID 的父键值。但是,我不知道VenueIDPushID 的值(见下文)。在不知道这些值的情况下,如何检查“drinkManufacturerID”的值是否相等。是否可以不重组我的数据库?

相关代码:

public class DealRawDataActivity extends AppCompatActivity {


DatabaseReference databaseDrinks;
DatabaseReference databaseManufacturer;


String keys;

FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_deal_raw_data);


    databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn"); //However, this string will not be know! How to get this string value?

    //To later be used in listView
    databaseDrinks.orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot datas : dataSnapshot.getChildren()) {
                keys = datas.getKey();
            }
            Toast.makeText(getApplicationContext(), keys, Toast.LENGTH_LONG).show();
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

   //databaseManufacturer = FirebaseDatabase.getInstance().getReference("drinks").child(keys);

}

}

数据库结构:

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    我不会知道 VenueID 或 PushID 的值(见下文)

    您需要知道VenueID 的值才能至少为-LWLuM2nesg0uaP0dLSn 节点查询数据库。所以下面的查询:

    .orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid())
    

    为您提供该特定对象中存在的所有饮料。

    是否可以不重组我的数据库?

    不,很遗憾,Firebase 中无法按照您的意愿查询两个或更多 Firebase 节点,在树的深处有两层。为了解决这个问题,您应该复制您的数据。这种做法称为denormalization,是 Firebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频,Denormalization is normal with the Firebase Database 以获得更好的理解。

    另外,当您复制数据时,需要牢记一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。

    话虽如此,在您的特定情况下,您应该考虑通过创建另一个名为 vanues 的节点来扩充您的数据结构以允许反向查找,您应该在其中添加所有对应的 drink 对象作为对象。所以你的数据库结构应该类似于这样:

    Firebase-root
       |
       --- vanues
            |
            --- -LZB-86uakRrWpI6VYzd (drink object)
                   |
                   --- drinkManufacturerID: "D1eY ... wrT5"
                   |
                   --- VenueID: "-LWLuM2nesg0uaP0dLSn"
    

    使用此模式,您可以简单地查询数据库以获取所有饮料,其中drinkManufacturerID 等于uid,使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference vanuesRef = rootRef.child("vanues");
    Query query = vanuesRef.orderByChild("drinkManufacturerID").equalTo(uid);
    query.addListenerForSingleValueEvent(/* ... */);
    

    如果您想从特定场所获取所有饮料,只需使用:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference vanuesRef = rootRef.child("vanues");
    Query query = vanuesRef.orderByChild("VenueID").equalTo(VenueID);
    query.addListenerForSingleValueEvent(/* ... */);
    

    其中VenueID 可能包含类似-LWLuM2nesg0uaP0dLSn 的值。

    【讨论】:

      【解决方案2】:

      您的代码没问题,但它适用于 uid 的所有孩子或任何东西。但是当您需要获取 uid 的孩子的孩子时。

      我的意思是,如果 UID 有 3 个孩子,例如 UID-->(Child1), (child2), (Child3)

      每个孩子都有孩子,例如

      UID-->(Child1)-->(childA),(childB)

      ......(child2)-->(childC),(childD)

      ......(child3)-->(childD),(childE)

      这些孩子的孩子(childA,childB,childC,childD,childE)持有数据 而且你需要在不知道父密钥和子密钥的情况下获取它,那么这很容易兄弟。 你只需要这样做

      for (DataSnapshot postSnapshot1 : dataSnapshot.getChildren()){for (DataSnapshot postSnapshot2 : postSnapshot1.getChildren()){//postSnapshot2 is accessed your child of child// using recycler view, adapter class and model class you can display the whole data for all child of child}}
      

      只需在您的代码上使用它

      databaseDrinks.orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
       @Override 
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) { 
      for (DataSnapshot datas1 : dataSnapshot.getChildren()) { for(DataSnapshot datas2 : datas1.getChildren()) { String keys = datas2.getKey(); 
      }} 
      Toast.makeText(getApplicationContext(), keys, Toast.LENGTH_LONG).show(); 
      } 
      @Override public void onCancelled(@NonNull DatabaseError databaseError) {
      
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多