gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:38:40 25 4
gpt4 key购买 nike

我想获取父键值,其中“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);

}

}

数据库结构:

enter image description here

最佳答案

I will not know the value of the VenueID or the PushID (see below)

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

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

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

Is it possible without restructuring my database?

不,遗憾的是,Firebase 中无法按照您的 Intent 查询两个或多个 Firebase 节点(树深两层)。要解决此问题,您应该复制数据。这种做法称为非规范化,是 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 的值。

关于java - 在不知道 Firebase 实时数据库中的键值的情况下检索子值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54813358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com