作为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");
结果为null,所以我写了这个查询:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
结果再次为空。检索钱包的唯一方法是使用此查询:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");
所以我是否应该总是使用en" orderByChild()"查询之前使用" equalTo()"?
那么,查询的目的是什么" equalTo(String value,String key)"比较" equalTo(字符串值),因为只有第二个正常工作?
答案 0 :(得分:8)
有些边缘情况不需要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
在上面的模型中,我推翻了Wallet
下的User
和UserWallet
,以便为用户查找钱包变得更加容易。
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
加载每个钱包。它可能是更多的代码,但它将非常有效(因为不涉及查询)。
答案 1 :(得分:0)
您可以使用嵌套查询。如果您有多个随机ID,您可以轻松比较它们。 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) {
}
});