【问题标题】:Android Firebase list data from keys来自键的 Android Firebase 列表数据
【发布时间】:2017-04-09 17:20:53
【问题描述】:

我有一个存储每个用户的项目密钥列表的节点。

我的user_projectes的结构是:

我已经开始使用 Firebase for Android,我最终得到了这个:

mFirebaseDatabaseReference.child("user_projects").child(mFirebaseUser.getUid())
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot projectSnapshot: snapshot.getChildren()) {
                    Log.e("Project","Project Key found: " + projectSnapshot.getKey());
                }
            }
            @Override
            public void onCancelled(DatabaseError firebaseError) {
                Log.e("Chat", "The read failed: " + firebaseError.getDetails());
            }
        });

目前我得到的是项目的钥匙。

我有另一个节点projects,用于存储项目数据。 项目数据存储在我的projects/$projectKey 节点中。

我还必须在我的 ListView/GridView 中填充项目 namephotoURL

如何检索我获得的每个项目密钥的项目数据并将其添加到我的列表视图中?

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

不幸的是,正如@rhari 所提到的,您确实必须进行另一个查询....我发现在使用 firebase 进行这样的“加入”时有用的是使用 RxJava ...可能有类似以下的内容(你可以在你的适配器中使用它来填充 ListView/RecyclerView)

public Observable<Project> getProjects(String userId) {
    return getProjectKeys(userId).flatMap(projectKey -> getProject(projectKey));
}

这是您希望列表在添加项目时动态更新的地方......在这种情况下,您需要具有 onChildAdded/onChildRemoved 等的列表器版本,然后需要这样做从中查找项目。

【讨论】:

  • 好多了!我一直在 JavaScript 中使用 RX,所以我也很想使用 RXJava
  • getBusinessKeys 应该是什么样子?
  • 也许您可以使用MergeWithZip 而不是flatMap 来接收两个查询结果,然后将它们映射或做任何您想做的事情。这样,两种查询方法完全不相互依赖。
【解决方案2】:

只需再次查询数据库

mFirebaseDatabaseReference.child("user_projects").child(mFirebaseUser.getUid())
    .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot projectSnapshot: snapshot.getChildren()) {
                String key = projectSnapshot.getKey();                         
                mFirebaseDatabaseReference.child("projects").child(key)
               .addListenerForSingleValueEvent(new ValueEventListener() {
                   @Override
                   public void onDataChange(DataSnapshot snapshot1) {
                       Project p = snapshot1.getValue();
                   }
               }
        }
        @Override
        public void onCancelled(DatabaseError firebaseError) {
            Log.e("Chat", "The read failed: " + firebaseError.getDetails());
        }
    });

【讨论】:

    【解决方案3】:

    您必须为您的项目实体创建一个模型,然后您才能使用Project mProject = projectSnapshot.getValue(Project.class);

    【讨论】:

    • 但是.. 我必须从我的projects 节点获取每个键的项目数据..
    • projectSnapshot.getKey() 只返回实体的键,projectSnapshot.getValue() 返回实体的值
    • 我不需要来自user_projects 节点的值,它只是一个数字,我需要来自projects 节点的所有项目数据(名称、图像等)...
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2021-12-03
    • 2016-11-25
    相关资源
    最近更新 更多