web-dev-qa-db-ja.com

FirebaseクエリequalTo(value、key)を使用するには?

Firebaseの初心者として、この単純なユースケースでユーザーのウォレットを取得する一種の「where句」リクエストを模倣しようとしました。

User
   48bde8f8-3b66-40bc-b988-566ccc77335c
      email: "[email protected]"
      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");

「equalTo()」を使用する前に、常に「orderByChild()」クエリを使用する必要がありますか?
それでは、クエリ「equalTo(String value、String key)」と「equalTo(String value)」の目的は何ですか?

16
ThierryC

orderBy...()を必要としないEdgeのケースがいくつかありますが、一般的には、フィルタリング操作の前にorderBy...()が必要です(equalTo()startAt()endAt())。

最初に Android用Firebaseプログラミングガイド (通常のJavaにも当てはまります)を読むことを強くお勧めします。ここに多数の質問を保存します。たとえば、これは クエリのセクション です。

それを読んだ後、 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: "[email protected]"
      username: "userTest1"

Wallet
   "F4PvtvNT2Z"
      coins: 26
      someList
         element1
         element2 

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

これで、構造が完全に平坦化されました。ユーザーのウォレットを確認するには、UserWaller/$uidその後、Wallets/$walletid。それはもう少しコードかもしれませんが、それは非常に効率的です(関係するクエリがないため)。

8

これにはネストされたクエリを使用できます。複数のランダム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) {

        }
    });
0
Atif AbbAsi