如何迭代Datasnapshot而不指定父文件夹/ ref

问题描述:

我想用以下结构来遍历数据快照;如何迭代Datasnapshot而不指定父文件夹/ ref

{ 
"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

Thankx克里斯,送我在正确的道路上进行搜索,但仍然没能建立正确的语法,达到什么,我试图做。

现在我的方法如下;

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()); 

从第一日志我得到每个节点的所有的值的字符串,并在第二个予构成的阵列,以包括所有的节点。

我想要做的是将一个特定的节点(例如地址值)添加到我在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()); 

假设您将一个ValueEventListenerimages

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

感谢您的帮助,我现在对它有了更好的理解,尽管我必须说我遇到了一个小问题,像在for循环中那样声明Datasnapshot为imagesSnapshot,这比我最初使用时没有那么困惑“孩子”,但了解它是如何工作的。 – JanusJanus

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

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

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

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

+0

谢谢@Chris_Conway,你有我在正确的方向上了解这种工作方式,并在一些搜索的帮助下,我达到了类似于我的这篇文章,但仍然无法构建正确的语法来实现我正在尝试做的事情,因为您可以ee在我更新的帖子 – JanusJanus

+0

不客气。你有没有试过(DataSnapshot child:parent.getChildren()){...}'? 'child.key'应该为这些子对象之一返回你的'fw88 ...'键。 –