在不知道 Firebase 实时数据库中的键值的情况下检索子值

Jus*_*tor 3 java android firebase firebase-realtime-database

我想获取父键值,其中“drinkManufacturerID”等于 currentUsers UID。但是,我不知道 theVenueID或 the的值PushID(见下文)。在不知道这些值的情况下,如何检查“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);

}
Run Code Online (Sandbox Code Playgroud)

}

数据库结构:

在此输入图像描述

Ale*_*amo 6

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

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

.orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid())
Run Code Online (Sandbox Code Playgroud)

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

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

不,不幸的是,Firebase 中无法按照您的意图查询两个或多个 Firebase 节点(树深两层)。要解决此问题,您应该复制数据。这种做法称为denormalizationFirebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频,非规范化在 Firebase 数据库中是正常的,以便更好地理解。

另外,当您复制数据时,需要记住一件事。就像添加数据一样,您也需要维护它。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方进行操作。

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

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

使用此模式,您可以使用以下代码行简单地查询数据库以获取所有饮料,其中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(/* ... */);
Run Code Online (Sandbox Code Playgroud)

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

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(/* ... */);
Run Code Online (Sandbox Code Playgroud)

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