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)
}
数据库结构:
我不知道 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。
| 归档时间: |
|
| 查看次数: |
3778 次 |
| 最近记录: |