如何在不指定父文件夹/ ref

时间:2016-05-29 10:27:54

标签: java android firebase firebase-realtime-database

我想使用以下结构迭代数据快照;

 {
"data" : {
"images" : {
  "fw88v6xu6wybamg9zzt6" : {
    "0550e909-3b30-4f83-9725-02fbe45b74ce" : 3,
    "address" : "http://xxxxxxxxxxxxxxx.jpg",
    "author" : "username1",
    "author_id" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "location" : "0",
    "rating" : 3
  },
  "osgm6v7kfcjwogo5uv21" : {
    "0550e909-3b30-4f83-9725-02fbe45b74ce" : 4,
    "address" : "xxxxxxxxxxxxxxxx.jpg",
    "author" : "username1",
    "author_id" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "location" : "0",
    "rating" : 4
  },
  "prhpcbrrru7z8x6xtolq" : {
    "0550e909-3b30-4f83-9725-02fbe45b74ce" : 6,
    "address" : "xxxxxxxxxxxxxx.jpg",
    "author" : "username2",
    "author_id" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "location" : 0,
    "rating" : 6
  }
},
"locations" : {
  "location1" : {
    "author" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "latitude" : 11.42222573,
    "longitude" : 58.4348011
  },
  "location2" : {
    "author" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "latitude" : 11.42222573,
    "longitude" : 38.4333311
  }
 }
}

具体来说,我正在做的是获取数据/图像子项的快照,因此它将是带有自动生成的引用的三个条目,例如fw88v6xu6wybamg9zzt6 因此我无法访问特定条目来检索作者的例子,所以我让我的应用程序获得

    Iterable<DataSnapshot> imagesDir = snapshot.getChildren();

我不知道如何查看此快照的每个条目并在不知道父参考的情况下检索输入信息。 (fw88v6xu6wybamg9zzt6)?

好吧,我到了post

感谢Chris,感谢我发送正确的搜索方式,但仍然无法构建正确的语法来达到我想要做的目的。

现在我的方法如下;

  public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot child: snapshot.getChildren()) {
                Log.i("MyTag", child.getValue().toString());
                imagesDir.add(String.valueOf(child.getValue()));
            }
            Log.i("MyTag", imagesDir.toString());

从第一个Log获取每个节点的所有值的字符串,在第二个节点我构造了一个数组以包含所有节点。

我想要做的是将每个迭代孩子的特定节点(例如地址值)添加到我在onDataChange方法之外声明的ArrayList。所以在for循环结束时,我会在arraylist中有三个地址(只有值)。

为了做到这一点,构造for循环的正确方法是什么?

嗯,我得到的最终代码给了我正确的结果如下:

              public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot child: snapshot.getChildren()) {
                Log.i("MyTag", child.getValue().toString());
                imagesDir.add(child.child("author").getValue(String.class));
            }
            Log.i("MyTag_imagesDirFinal", imagesDir.toString());

2 个答案:

答案 0 :(得分:10)

假设您将ValueEventListener附加到images

public void onDataChange(DataSnapshot imagesSnapshot) {
    for (DataSnapshot imageSnapshot: imagesSnapshot.getChildren()) {
        imagesDir.add(imageSnapshot.child("address").getValue(String.class));
    }
    Log.i("MyTag", imagesDir.toString());
}

答案 1 :(得分:1)

如果检索“images”的快照,即使不知道密钥,也可以访问getChildren()方法迭代每个图像。

如果需要,可以通过调用孩子的getKey()来访问它们。

可以在参考文档中找到对getChildren()方法的引用:

https://firebase.google.com/docs/reference/android/com/google/firebase/database/DataSnapshot.html#public-methods