【问题标题】:How to use Firebase query equalTo(value, key)?如何使用 Firebase 查询 equalTo(value, key)?
【发布时间】:2016-06-03 19:35:20
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    您可以为此使用嵌套查询。!如果您有多个随机 id,您可以轻松比较它们。! DatabaseReference 参考 = 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) {
    
            }
        });
    

    【讨论】:

      【解决方案2】:

      有些极端情况不需要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 
      

      在上述模型中,我将UserWallet 下的WalletUser 颠倒了,以便为用户查找钱包变得更加容易。

      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 加载每个钱包。它可能会多一些代码,但它会非常高效(因为不涉及任何查询)。

      【讨论】:

      • 感谢您的快速回答。我正在寻找一种你写的数据结构(最后一个),我需要一些确认;那太好了。关于 Firebase 指南,我当然在这里提问之前阅读了它,但是 orderBy() 和 EqualTo() 之间的关系对我来说还不够清楚。
      • 如果 uid=1 的用户有 10 个钱包,我必须执行 11 个请求,首先是到 UserWallet,然后是另外 10 个请求。还是比一个请求一个查询更高效?
      • 如何仅获取电子邮件值?过滤 emal 值是否正确?....usersReference.child("users") .orderByChild("email") .startAt(s.toString()).endAt(s+"\uf8ff"));? ???请帮助
      • @GraceVenkat 如果您的意思是获取特定用户的电子邮件,您可以使用ref.child('User').child(auth.uid).getValue()。因此,您可以使用 getter 方法来获取电子邮件值。
      猜你喜欢
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多