如何使用Firebase查询equalTo(值,键)?

时间:2016-02-22 11:35:20

标签: java android firebase firebase-realtime-database

作为firebase的新手,我试图模仿一种" where子句"请求在这个简单的用例中检索用户的钱包:

User
   48bde8f8-3b66-40bc-b988-566ccc77335c
      email: "toto@acme.com"
      username: "userTest1"

UserWallet
   F4PvtvNT2Z
      coins: 26
      someList
         elemet1
         elemet2 
      user: "48bde8f8-3b66-40bc-b988-566ccc77335c"

首先,我试图像这样编写我的请求:

Firebase root = new Firebase("https://myApp.firebaseio.com/");
Firebase ref = root.child("UserWallet");
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

结果为null,所以我写了这个查询:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

结果再次为空。检索钱包的唯一方法是使用此查询:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");

所以我是否应该总是使用en" orderByChild()"查询之前使用" equalTo()"?
那么,查询的目的是什么" equalTo(String value,String key)"比较" equalTo(字符串值),因为只有第二个正常工作?

2 个答案:

答案 0 :(得分:8)

有些边缘情况不需要orderBy...(),但通常在过滤操作(orderBy...()equalTo()之前需要startAt()endAt())。

我强烈建议您先阅读Firebase programming guide for Android(其中95%也适用于常规Java)。在该指南中花费了几个小时,这里将节省数十个问题。例如:这是section on queries

阅读完之后,您可能还想阅读NoSQL Data Modeling上的本指南。它涵盖了NoSQL数据建模中的许多常见模式,并将帮助您尽早意识到尝试将SQL查询映射到NoSQL数据库是一个合乎逻辑的想法,但很少是一个好的。

我的初始(不知道你的用例,除了“我需要能够为用户找到钱包”)模型:

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"
         coins: 26
         someList
            element1
            element2 

在上面的模型中,我推翻了Wallet下的UserUserWallet,以便为用户查找钱包变得更加容易。

ref.child('UserWallet').child(auth.uid).addValueEventListener(...

请注意,此处不涉及任何查询,因此无论您在数据库中拥有多少用户,加载都会同样快速。

或者:

User
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      email: "toto@acme.com"
      username: "userTest1"

Wallet
   "F4PvtvNT2Z"
      coins: 26
      someList
         element1
         element2 

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"

现在我们已经完成了扁平结构。要确定用户的钱包,请转到UserWaller/$uid,然后从Wallets/$walletid加载每个钱包。它可能是更多的代码,但它将非常有效(因为不涉及查询)。

答案 1 :(得分:0)

您可以使用嵌套查询。如果您有多个随机ID,您可以轻松比较它们。     DatabaseReference reference = FirebaseDatabase.getInstance()。getReference();

    Query query = reference.child("user");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                // dataSnapshot is the "issue" node with all children with id 0
                for (DataSnapshot issue : dataSnapshot.getChildren()) {
                    // do something with the individual "issues"

Query query = reference.child("user").child(dataSnapshot.getKey().equals(YourData)));
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {






                }

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });