我的 Firebase 实时数据库中为每家餐厅都有一个美食类别。
餐厅1菜系:意大利菜。餐厅2美食:快餐
如何从 Firebase 实时数据库获取所有美食并在芯片组中创建同名芯片?
我尝试这样做,但是当我有 2 家餐厅提供相同的菜肴时,芯片组会创建 2 个具有相同名称的芯片。我尝试了 Hashset 但没有任何改变。
或者有什么方法可以创建一个包含 15 个薯条的薯条组并隐藏这些薯条(它们的名字在任何餐厅美食中都不存在)。 例如,如果没有餐厅有 quisine :Italian ,则名为 Italian 的芯片在 Chipg roup 中不可见。
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("resturants");
Query query = reference.orderByChild("cuisine");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
if (ds.getValue() != null){
String restaurant_cuisine = String.valueOf(ds.child("cuisine").getValue());
List<String> list = new ArrayList<>();
list.add(restaurant_cuisine);
HashSet<String> hashSet = new HashSet<>();
hashSet.addAll(list);
for (String string :hashSet){
Chip chip = new Chip(mContext);
chip.setText(string);
chipgroup.addView(chip);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
当您使用以下查询时:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("resturants");
Query query = reference.orderByChild("cuisine");
表示您正在阅读“餐厅”节点内的所有餐厅,并根据“菜品”字段进行点餐。这意味着,如果您有两家具有相同“美食”名称的餐厅,那么您确实会获得两条记录。由于您有两家餐厅提供特定美食,因此将生成两个筹码。不幸的是,在 Firebase 实时数据库中,您无法仅获取特定类型的单个记录。请注意,NoSQL 数据库查询中没有
SELECT DISTINCT
语句。
因此在这种情况下,我建议您创建一个额外的节点,仅存储芯片名称:
db
|
--- chips
|
--- italian: true
|
--- fastFood: true
其中
key
是“美食”名称,而值是布尔值 true
。这意味着你必须单独管理这个节点,这意味着每次添加具有新类型菜系的新餐厅时,请在此处添加菜系名称。如果菜品名称被删除或更新也是如此。
因为名称键名称是唯一的,那么您可以读取所有这些键并创建芯片。在这种情况下,根本不会有重复项。因此,您将拥有一份独特的“美食”薯条清单。由于它是一个列表,例如,如果您想显示特定菜系的所有餐厅,那么您必须跟踪用户选择并执行如下所示的查询:
String userSelection = "italian"
Query queryByCuisine = query.equalTo("cuisine", userSelection);