首页 文章

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

提问于
浏览
16

作为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");

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

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

那么我以前是否必须始终使用en "orderByChild()"查询才能使用"equalTo()"?
那么,查询的目的是什么"equalTo(String value, String key)"与“equalTo(String value)相比,因为只有第二个才能正常工作?

2 回答

  • 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
    

    在上面的模型中,我已经将 WalletUser 倒置在 UserWallet 下,因此为用户查找钱包变得更加容易 .

    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 加载每个钱包 . 它可能是更多的代码,但它将非常有效(因为没有涉及查询) .

  • 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) {
    
            }
        });
    

相关问题