Firebase查询列表<string>&#34;包含&#34;值

时间:2018-04-04 15:09:19

标签: java android firebase firebase-realtime-database

{
  "SHOPPING_LIST" : {
    "kPLZpp809gePpBiBojsngjZdg6A3:228c1e5b-fe11-4f06-ad32-c54734044a5e" : {
      "listId" : "kPLZpp809gePpBiBojsngjZdg6A3:228c1e5b-fe11-4f06-ad32-c54734044a5e",
      "listName" : "Lista de la compra de Jesús Lunar Pérez",
      "owner" : "kPLZpp809gePpBiBojsngjZdg6A3",
      "pendingListElements" : 0,
      "sharedWithUsers" : [ "kPLZpp809gePpBiBojsngjZdg6A3" ]
    }
  },
  "users" : {
    "kPLZpp809gePpBiBojsngjZdg6A3" : {
      "label" : "Jesús Lunar Pérez",
      "userId" : "kPLZpp809gePpBiBojsngjZdg6A3",
      "userInfo" : {
        "nickName" : "Jesús Lunar Pérez",
        "userEmail" : "lunarjchav@gmail.com"
      }
    }
  }
}

我已将这些数据存储在实时数据库中,并且我试图获取与某些用户共享的所有SHOPPING_LIST。

我查询数据,例如:

Query query = FirebaseDatabase.getInstance()
        .getReference("SHOPPING_LIST")
        .orderByChild("sharedWithUsers")
        .equalTo(userId /*userId = "kPLZpp809gePpBiBojsngjZdg6A3"*/)
        ;

但我没有得到任何东西。

我做错了什么?有没有办法调试查询?

提前致谢。

编辑:

最后,正如所建议的那样,我将数据组织更改为:

{
  "SHOPPING_LIST" : {
    "kPLZpp809gePpBiBojsngjZdg6A3:f65836e3-1f79-43a8-aae8-5a9bb9eb3929" : {
      "listId" : "kPLZpp809gePpBiBojsngjZdg6A3:f65836e3-1f79-43a8-aae8-5a9bb9eb3929",
      "listName" : "Lista de la compra de Jesús Lunar Pérez",
      "owner" : "kPLZpp809gePpBiBojsngjZdg6A3",
      "pendingListElements" : 0,
      "sharedWithUsers" : {
        "kPLZpp809gePpBiBojsngjZdg6A3" : true
      }
    }
  },
  "users" : {
    "kPLZpp809gePpBiBojsngjZdg6A3" : {
      "label" : "Jesús Lunar Pérez",
      "userId" : "kPLZpp809gePpBiBojsngjZdg6A3",
      "userInfo" : {
        "nickName" : "Jesús Lunar Pérez",
        "userEmail" : "lunarjchav@gmail.com"
      }
    }
  }
}

我问过:

        Query query = FirebaseDatabase.getInstance()
                .getReference(ShoppingList.LIST_TYPE.name())
                .orderByChild("sharedWithUsers/" + uid)
                .equalTo(true)
                ;

1 个答案:

答案 0 :(得分:1)

Firebase无法跨阵列成员执行查询,以查看它是否包含任何位置的特定值或添加/删除记录。

请注意,Firebase文档建议不要使用数组。 Firebase建议的其中一个原因是它使安全规则无法编写。

与NoSQL数据库一样,我会建议您使用这样的替代结构:

  "SHOPPING_LIST" : {
    "kPLZpp809gePpBiBojsngjZdg6A3:228c1e5b-fe11-4f06-ad32-c54734044a5e" : {
      "listId" : "kPLZpp809gePpBiBojsngjZdg6A3:228c1e5b-fe11-4f06-ad32-c54734044a5e",
      "listName" : "Lista de la compra de Jesús Lunar Pérez",
      "owner" : "kPLZpp809gePpBiBojsngjZdg6A3",
      "pendingListElements" : 0,
      "sharedWithUsers" {
        "kPLZpp809gePpBiBojsngjZdg6A3": true
      }
    }

因此,我们不是使用数组,而是map,其中键是uid,值是布尔true

您还可以查看here,了解更多信息。