How to use Firebase query equalTo(value, key)?

前端 未结 2 1242
时光取名叫无心
时光取名叫无心 2021-02-02 13:04

As a newbie in firebase I tried to mimic a kind of \"where clause\" request to retrieve the user\'s wallet in this simple use case:

User
   48bde8f8-3b66-40bc-b         


        
相关标签:
2条回答
  • 2021-02-02 13:34

    There are some edge cases that don't need an orderBy...(), but in general you'll need an orderBy...() before a filtering operation (equalTo(), startAt(), endAt()).

    I highly recommend that you first read the Firebase programming guide for Android (95% of it applies to regular Java too). A few hours spent in that guide, will save dozens of questions here. For example: this is the section on queries.

    After reading that, you might also want to read this guide on NoSQL Data Modeling. It covers many common patterns in NoSQL data modeling and will help you realize early on that trying to map SQL queries to a NoSQL database is a logical idea, but seldom a good one.

    My initial (without any idea on your use-cases, except for "I need to be able to find the wallets for a user") model:

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

    In the above model, I've inverted the Wallet and User under UserWallet, so that looking up the wallet(s) for a user becomes easier.

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

    Note that there is no query involved here, so loading will be equally fast no matter how many users you have in your database.

    Or alternatively:

    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"
    

    Now we've complete flattened the structure. To determine the wallets of a user, you go to UserWaller/$uid and then load each wallet from Wallets/$walletid. It may be a bit more code, but it'll be extremely efficient (since there are no queries involved).

    0 讨论(0)
  • 2021-02-02 13:52

    You can use nested Query for this.! if you have multiple random id you can easily compare them.! 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) {
    
            }
        });
    
    0 讨论(0)
提交回复
热议问题