【问题标题】:Firebase Data RetrievalFirebase 数据检索
【发布时间】:2015-01-04 01:04:57
【问题描述】:

我正在使用 Firebase for Android 制作一个涉及群组的应用 我的 firebase 中有一个使用 push 方法推送的项目列表,如下所示:

-Groups Joined:
               ~Unique Key: Group 1 Name
               ~Unique Key: Group 2 Name

我正在尝试在我的 android 代码中将此列表检索为 Java 列表。我需要能够通过索引而不是唯一键访问加入的组节点中的信息,我正在使用此代码。

Query groupsJoined = myUserRef.child("Groups Joined").orderByKey();

    groupsJoined.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            // do some stuff once
            groupNames = (ArrayList<String>) snapshot.getValue();


        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });

代码崩溃是因为 snapshot.getValue() 返回了一个 map 类型的对象。我无法访问地图的元素,因为我没有将这些唯一键存储在 android 设备上,我也不想这样做。我如何才能将数据快照作为可以迭代的东西返回并从中取出组名,而不必使用唯一键?

【问题讨论】:

  • 您可以遍历 Map 的值 - 这还不够吗?见docs.oracle.com/javase/7/docs/api/java/util/Map.html#values()
  • 组自然是按键排序的,所以这里的查询是没有必要的。你都尝试了些什么?数据很容易迭代。特别是考虑到 getChildren() 返回 Iterable。此外,您可能希望添加子事件而不是单值事件。

标签: android firebase firebase-realtime-database


【解决方案1】:

Map 转换为List 非常简单。

试试这个代码:

myUserRef.child("Groups Joined").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        // do some stuff once
        Map groupNames = snapshot.getValue();
        List groupNamesList = new ArrayList(groupNames.values());
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {
    }
});

如果snapshot.getValue() 的默认行为没有解决它,您也可以pass in a Java class,客户端将尝试使用Jackson 将其反序列化到该类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多