从查询结果中获取密钥时遇到问题。这是我的Firebase数据库结构:
{
"Users" : {
"7idb6ThWR8aqmnEHFao5GRCV1kI3" : {
"dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7",
"status" : "hi my name is erik",
"uid" : "7idb6ThWR8aqmnEHFao5GRCV1kI3",
"username" : "erik"
}
},
"posts" : {
"-KfsrGsY8TWb2wiMFtAq" : {
"dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7",
"image" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Post_Images%2Fcropped1354055061.jpg?alt=media&token=77fbc9ed-4356-43c1-b7bb-9563300a8b7b",
"small_title" : "tes",
"summary" : "tes",
"title" : "tes",
"uid" : "7idb6ThWR8aqmnEHFao5GRCV1kI3",
"username" : "erik"
}
}
}
我想获得KfsrGsY8TWb2wiMFtAq
,但使用下面的代码
Query mThisUsersPosts;
public static final String TAG = "blah" ;
mDatabasePosts = FirebaseDatabase.getInstance().getReference().child("posts");
mThisUsersPosts = mDatabasePosts.orderByChild("uid").equalTo(mCurrentUser);
mThisUsersPosts.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final String posts_key = dataSnapshot.getChildren().toString();
Log.d(TAG,posts_key);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我不明白为什么没有得到结果我得到随机回调,如:
com.google.firebase.database.DataSnapshot$1@cfbcf64
com.google.firebase.database.DataSnapshot$1@961642a
com.google.firebase.database.DataSnapshot$1@6f0d191
非常感谢!
答案 0 :(得分:4)
您需要的是迭代帖子以获取个别帖子的关键
for(Datasnapshot snap : datasnapshot.getChildren()){
String key = snap.getKey();
Post post =snap.getValue(Post.class);
}
谢谢
答案 1 :(得分:2)
对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。因此,您需要迭代返回的快照的子项以获取单个结果。
mThisUsersPosts.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
System.out.println(child.getKey());
System.out.println(child.child("title").getValue());
}
}
请注意,我想知道您选择的数据结构是否适合您的应用。如果您的主要用例是显示特定用户的帖子,请考虑对数据进行建模:
{
"Users" : {
"7idb6ThWR8aqmnEHFao5GRCV1kI3" : {
"dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7",
"status" : "hi my name is erik",
"uid" : "7idb6ThWR8aqmnEHFao5GRCV1kI3",
"username" : "erik"
}
},
"posts" : {
"7idb6ThWR8aqmnEHFao5GRCV1kI3": {
"-KfsrGsY8TWb2wiMFtAq" : {
"dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7",
"image" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Post_Images%2Fcropped1354055061.jpg?alt=media&token=77fbc9ed-4356-43c1-b7bb-9563300a8b7b",
"small_title" : "tes",
"summary" : "tes",
"title" : "tes",
"username" : "erik"
}
}
}
}
使用这种结构,您可以使用更简单/更快的构造获得用户的帖子:
mThisUsersPosts = mDatabasePosts.child(mCurrentUser);
mThisUsersPosts.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
System.out.println(child.getKey());
System.out.println(child.child("title").getValue());
}
}
答案 2 :(得分:0)
您需要做的是:
//This assumes Post is the data type you're trying to get.
final Posts posts = dataSnapshot.getValue(Posts.class);
如果您有多个帖子,可以这样做:
for(Datasnapshot data : datasnapshot.getChildren()){
Post post = data.getValue(Posts.class);
}
从那里你可以得到你需要的任何东西。这是关于Firebase的好处,它将为您构建您的模型。因此,您可以执行posts.getPostTile()
和posts.getPostSummary()
之类的操作。这真的很方便。