【问题标题】:How can you return multiple items with a single query in Firebase?如何在 Firebase 中使用单个查询返回多个项目?
【发布时间】:2017-04-15 15:40:44
【问题描述】:

我以前从未使用过 NoSQL 数据库,所以我对它们的工作方式有点困惑。我正在尝试创建一个城市的吸引力数据库。我对每个城市都有一个键和一个值。在每个城市下我都想有一个景点列表。

问题是每个景点都需要自己的钥匙。如果我为每个景点提供自己的密钥,那么如何使用单个查询返回一个城市的所有景点?我不需要为每个键运行查询以获取每个值吗?

我基本上是想弄清楚如何设置我的数据库,以便我可以在 London 上运行查询并获取它下面列出的三个项目。

【问题讨论】:

  • ref.child("London").addChildEventListener(...
  • 这样会创建一个名为onDataChange 的方法,我将使用dataSnapshot.getValue() 返回所有项目的映射。但是我如何在不知道它们的所有键是什么的情况下获取单个项目。
  • 一个ChildEventListeneronChildAdded,它会为该位置下的每个child 节点触发。试试看,或者参加 Firebase codelab for Android,它会教授这个等等。

标签: android firebase firebase-realtime-database nosql


【解决方案1】:

首先,您必须为您的景点创建一个 POJO(普通旧 Java 对象),其中包含描述等。变量需要与数据库中的键一致:

@IgnoreExtraProperties
public class Attraction{
    String name, description1, descrition2;
    //Other variables/keys

    String getName(){
        return this.name;
    }

    void setName(String name){
        this.name = name;
    }

    //Other getter/setter methods
    public Attraction(){}
}

接下来你的数据库结构应该是这样的:

City
---Attraction Name
------Description 1
------Description 2

然后你可以简单地执行查询:

DatabaseReference ref = databaseReference.child("City").child("London");

然后将它与监听器结合以获取景点并将其存储在列表中:

List<Attraction> attractions = new ArrayList<>();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot val : dataSnapshot.getChildren()){
            Attraction attraction = val.getValue(Attraction.class);
            attraction.setName(val.getKey()); //This is because the key is the attraction name based on the structure
            attractions.add(attraction));
        }
        //After getting all of them in a list, return them
        return attractions; //use this if you want to return them as a List Object
        return attractions.toArray(new Attraction[attractions.size()]); //use this if you want to return it as an array
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
})

如果这对你有帮助,请告诉我。

【讨论】:

  • 等等,你是在告诉我这将返回伦敦下列出的所有景点吗?我将这些存储到地图中,那么如何访问各个景点?
  • 要单独访问它们,遍历列表
  • 在您的示例中,如果您不知道所有值的所有键,您将如何访问它们?我看到您基本上是在循环获取快照的大小,但是您如何访问地图中的实际值?
  • 还有谁可以在 dataSnapshot 上使用 for 循环?我刚刚尝试过,它给了我一个错误,说 foreach 不适用。
  • 您能否添加更多关于您需要哪些特定输出的详细信息?带有您需要的键的输出
猜你喜欢
  • 2018-11-11
  • 2020-10-26
  • 1970-01-01
  • 2018-09-14
  • 2015-10-29
  • 2010-10-20
  • 2018-06-21
  • 1970-01-01
  • 2019-01-04
相关资源
最近更新 更多