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)」の目的は何ですか?
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
上記のモデルでは、Wallet
とUser
の下の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
。それはもう少しコードかもしれませんが、それは非常に効率的です(関係するクエリがないため)。
これにはネストされたクエリを使用できます。複数のランダム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) {
}
});