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结果,然后映射它们,或者用它们做任何你想做的事情。通过这种方式,两种查询方法完全不依赖于彼此。