chipgroup - firebase 数据库 - java

问题描述 投票:0回答:1

我的 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) {

    }
});
java android firebase firebase-realtime-database android-chips
1个回答
0
投票

当您使用以下查询时:

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);
© www.soinside.com 2019 - 2024. All rights reserved.