Как использовать запрос Firebase equalTo (значение, ключ)?
Как новичок в firebase, я попытался воспроизвести некий запрос "where clause" для извлечения пользовательского кошелька в этом простом случае:
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");
Поэтому Должен ли я всегда использовать запрос "orderByChild()" перед тем, как использовать "equalTo()"?
Итак, какова цель запроса "equalTo (String value, String key)" по сравнению с "equalTo (String value), поскольку только второй работает правильно?
Ответы
Ответ 1
Есть некоторые случаи кросс, которые не нуждаются в orderBy...()
, но в общем случае вам понадобится orderBy...()
до операции фильтрации (equalTo()
, startAt()
, endAt()
).
Я настоятельно рекомендую вам сначала прочитать Руководство по программированию Firebase для Android (95% из них относится и к обычной 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
. Это может быть немного больше кода, но он будет чрезвычайно эффективным (поскольку в нем нет запросов).
Ответ 2
Для этого вы можете использовать вложенный запрос.! если у вас есть несколько случайных идентификаторов, вы можете легко их сравнить.! База данныхReference 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) {
}
});