从Firebase查询中获取密钥

时间:2017-03-23 02:28:50

标签: android firebase firebase-realtime-database

从查询结果中获取密钥时遇到问题。这是我的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

非常感谢!

3 个答案:

答案 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()之类的操作。这真的很方便。