【问题标题】:How to retrieve data from firebase based on some key's value which is in nested json object如何根据嵌套 json 对象中的某个键值从 firebase 检索数据
【发布时间】:2021-08-24 20:13:54
【问题描述】:

我的帖子项目在 Firebase 数据库中有这种结构。

"posts" : {
"-LP-UfzuUHFJOkY0Ogb9" : {
  "dislikeCount" : "0",
  "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/privato-dfb2c.appspot.com/o/images%2F2309fdab-0d78-44e5-af1f-8d256efdf6fd.jpg?alt=media&token=1276804f-d48c-4e06-8982-309fd539a397",
  "likeCount" : "0",
  "postByUser" : {
    "aboutMe" : "death is inevitable",
    "countryCode" : "+91",
    "imageUrl" : "https://i.imgur.com/hAazykl.jpg",
    "mobileNumber" : "number",
    "name" : "Sid",
    "userName" : "deathcode"
  },
  "timeStamp" : 1539754082148,
  "title" : "This is cool, lowest price ever on grocers.",
  "type" : 3
}
}

现在我需要根据 json 对象“postByUser”下的 userName 的值来检索某个用户发表的所有帖子。 我按照某些指南来解决这个问题,但他们都在根帖子项下的 json 键值上工作,而不是在帖子项下的另一个 json 对象下使用

 Query query = dbRef.child("posts").orderByChild("title").equalTo("sometitle");

但是如何将它用于嵌套的 json 对象?

【问题讨论】:

  • 嘿@SidhantRajora 通过单击答案旁边的 V 或勾号类型查找按钮将答案标记为正确,因为这有助于 Stack 溢出未来的读者,我会很感激,干杯! :)

标签: android firebase firebase-realtime-database


【解决方案1】:

您可以将路径传递给orderByChild,因此:

Query query = dbRef.child("posts").orderByChild("postByUser/name").equalTo("deathcode");

【讨论】:

  • post 直接没有 postByUser/name 作为直接子项
  • 没错。 Firebase 数据库查询获取引用的每个子节点,然后找到您在 orderByChild 中为该节点指定的属性。试试看。 :-)
【解决方案2】:

使用orderByChild() 查询及其dataSnapshot 后,您可以获取所有同级子值。

这个代码看起来像这样:

//ref is the correct database reference to your firebase database

ref.orderByChild("userName").equalTo(userNameYouWant).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        for (DataSnapshot ds: dataSnapshot.getChildren()) {
            String aboutMe = ds.child("aboutMe").getValue(String.class);
        }

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

您可以使用相同的方式检索其他兄弟节点值。

【讨论】:

  • 不起作用,因为帖子的子项具有我没有参考的密钥,并且无法获取 postedByUser 并且无法按此过滤帖子
  • 您不需要在数据库中拥有属于 posts 子项的密钥,此代码也可以正常工作。
  • @SidhantRajora,您可以在这里阅读更多相关信息,google.com/…
  • 不行,我改变了firebase数据库的结构。
【解决方案3】:
`Query query = dbRef.child("posts").orderByChild("postByUser/name").equalTo("deathcode");`

上述解决方案永远不会奏效!而且我相信它永远不会起作用,因为没有特定的孩子参考并记住存储的数据会随着时间的推移而不断变化。 Firebase 生成它自己的唯一 Id 的“-LP-UfzuUHFJOkY0Ogb9”并将其强制放置为子节点。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多