Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓Firebase从密钥列表数据_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 安卓Firebase从密钥列表数据

Android 安卓Firebase从密钥列表数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有一个节点,用于存储每个用户的项目密钥列表 我的用户\u项目的结构是: 我已经开始使用Firebase for Android,最终我得到了以下结果: mFirebaseDatabaseReference.child("user_projects").child(mFirebaseUser.getUid()) .addListenerForSingleValueEvent(new ValueEventListener() { @Override

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

我的
用户\u项目的结构是:

我已经开始使用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中填充项目
name
photoURL


如何检索我获得的每个项目密钥的项目数据并将其添加到我的listview?

您必须为项目实体创建一个模型,然后可以使用
project mProject=projectSnapshot.getValue(project.class)

您必须为您的项目实体创建一个模型,然后您可以使用
project-mProject=projectSnapshot.getValue(project.class)

只需再次查询数据库即可

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

只需再次查询数据库

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

不幸的是,正如@rhari所提到的,您确实需要进行另一个查询……我发现在使用firebase进行这样的“连接”时有用的是使用RxJava……例如,可以有如下内容(您可以在适配器中使用它来填充ListView/RecyclerView)

公共可观察的getProjects(字符串userId){
返回getprojectkey(userId).flatMap(projectKey->getProject(projectKey));
}

在这种情况下,您希望列表随着项目的添加而动态更新……在这种情况下,您需要的listner版本具有
onChildeded
/
onChildRemoved
等,然后需要从这些列表中查找项目。

不幸的是,正如@rhari所提到的,您必须进行另一个查询……什么我发现,当使用firebase进行这样的“连接”时,使用RxJava非常有用……例如,可以有如下内容(您可以在适配器中使用这些内容来填充ListView/RecyclerView)

公共可观察的getProjects(字符串userId){
返回getprojectkey(userId).flatMap(projectKey->getProject(projectKey));
}

在这种情况下,您希望列表随着项目的添加而动态更新……在这种情况下,您需要的listner版本具有
onChildeded
/
onChildRemoved
等,然后需要从中查找项目。

使用
DataSnapshot.getValue()
方法。DataSnapshot引用->我需要来自不同节点的数据。。在这个节点中,我只选键使用
DataSnapshot.getValue()
方法。DataSnapshot引用->我需要来自不同节点的数据。。在这个节点中,我只选键,但是。。我必须从我的
projects
节点获取每个键的项目数据。
projectSnapshot.getKey()
只返回实体的键,
projectSnapshot.getValue()
返回该实体的值我不需要来自
user\u projects
节点的值,它只是一个数字,我需要
projects
节点的所有项目数据(名称、图像等)…但是。。我必须从我的
projects
节点获取每个键的项目数据。
projectSnapshot.getKey()
只返回实体的键,
projectSnapshot.getValue()
返回该实体的值我不需要来自
user\u projects
节点的值,它只是一个数字,我需要
项目中的所有项目数据
节点(名称、图像等)…更好!我一直在使用javascript中的RX,所以我很想使用RXJava来处理
getBusinessKeys
应该是什么样子的?也许你可以使用
MergeWith
Zip
而不是
flatMap
来接收两个queryes结果,然后映射它们,或者用它们做任何你想做的事情。通过这种方式,两种查询方法完全互不依赖。这样更好!我一直在使用javascript中的RX,所以我很想使用RXJava来处理
getBusinessKeys
应该是什么样子的?也许你可以使用
MergeWith
Zip
而不是
flatMap
来接收两个queryes结果,然后映射它们,或者用它们做任何你想做的事情。通过这种方式,两种查询方法完全不依赖于彼此。