【问题标题】:Getting keys from Firebase query从 Firebase 查询中获取密钥
【发布时间】:2017-03-23 11:30:38
【问题描述】:

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

非常感谢!

【问题讨论】:

  • 你可以像datasnapshot.getKey()一样从datasnapshot中获取item key;
  • 嗨@Mohom.R ...尝试过...它正在返回“帖子”哈哈...太高了一级
  • 我已经发了答案请看..

标签: android firebase firebase-realtime-database


【解决方案1】:

您需要对帖子进行迭代以获取单个帖子的密钥

for(Datasnapshot snap : datasnapshot.getChildren()){
    String key = snap.getKey();
     Post post =snap.getValue(Post.class);
  }

谢谢

【讨论】:

  • 嗨@Mohom.R 谢谢你的回答......这绝对是我应该做的,尽管弗兰克·范·普菲伦的回答更相关,因为他使用我的情况作为答案,所以我不能接受你的答案作为答案,但我会赞成这个!
【解决方案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());
        }
    }

【讨论】:

  • 完美,这正是我所需要的。尽管我已经达到了预期的结果。是的,您的建议要好得多(希望我可以投票两次)。如何传递用户 uid 以设置为“posts”键?
【解决方案3】:

你需要做的是:

//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()之类的事情。它真的很方便。

【讨论】:

  • 嗨 BlackHatSamurai...感谢您的回答...抱歉,我不明白 Posts.class 是什么?我是否必须创建那个类我试图从 Firebase 数据库中获取数据,如我在我的问题中发布的 Json 中所示(抱歉,如果我不理解一些应该非常简单的东西,因为我对 Android 编程还是很陌生和 Firebase 呵呵)
  • @Jagmaster 它是您尝试获取的任何数据类型的类。我以帖子为例。您存储的每一类数据的内容,就是您放在那里的内容。
猜你喜欢
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2016-11-08
  • 2017-12-05
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多