Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Firebase查询等式(值、键)?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何使用Firebase查询等式(值、键)?

Java 如何使用Firebase查询等式(值、键)?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,作为firebase的新手,我尝试在这个简单的用例中模拟一种“where子句”请求来检索用户的钱包: User 48bde8f8-3b66-40bc-b988-566ccc77335c email: "toto@acme.com" username: "userTest1" UserWallet F4PvtvNT2Z coins: 26 someList elemet1 elemet2

作为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");
结果为空,因此我编写了以下查询:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");
结果再次为空。检索钱包的唯一方法是使用以下查询:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");
那么,在使用“equalTo()”之前,我是否必须始终使用en“orderByChild()”查询

因此,查询“equalTo(String value,String key)”与“equalTo(String value)”相比的目的是什么呢?因为只有第二个可以正常工作。

有些边缘情况不需要使用
orderBy…()
,但通常在进行过滤操作(
equalTo())之前需要使用
orderBy…()
startAt()
endAt()

我强烈建议您首先阅读(其中95%也适用于常规Java)。在该指南中花上几个小时,可以在这里省去几十个问题。例如:这是

阅读之后,您可能还想阅读本指南。它涵盖了NoSQL数据建模中的许多常见模式,并将帮助您尽早认识到,尝试将SQL查询映射到NoSQL数据库是一个合乎逻辑的想法,但很少是一个好主意

我的初始模型(对您的用例没有任何概念,除了“我需要能够为用户找到钱包”)模型:

在上面的模型中,我将
钱包
用户
倒置在
用户钱包
下,以便更容易地查找用户的钱包

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
加载每个钱包。这可能需要更多的代码,但效率极高(因为不涉及任何查询).

您可以为此使用嵌套查询。!如果您有多个随机id,您可以轻松比较它们。! DatabaseReference=FirebaseDatabase.getInstance().getReference()


感谢您的快速回答。我正在寻找您编写的一种数据结构(上一种),我需要一些确认;这很好。关于Firebase指南,我在这里提问之前当然阅读了它,但是orderBy()和EqualTo()之间的关系对我来说还不够清楚。如果uid=1的用户有10个钱包,我必须执行11个请求,首先是
UserWallet
,然后是10个附加请求。这仍然比使用一个请求和一个查询更有效?如何仅获取电子邮件值?获取emal值是否正确?…usersReference.child(“用户”).orderByChild(“电子邮件”).startAt(s.toString()).endAt(s+“\uf8ff”);请help@GraceVenkat如果您想获取特定用户的电子邮件,可以使用
ref.child('user').child(auth.uid).getValue()
。因此,您可以使用getter方法获取电子邮件值。