Android 如何使用两个子值在Firebase中搜索?
我想从Firebase实时数据库中获取所有节点,其中搜索结果与子值匹配。例如,考虑我下面的FixBASE结构:Android 如何使用两个子值在Firebase中搜索?,android,database,firebase,android-studio,firebase-realtime-database,Android,Database,Firebase,Android Studio,Firebase Realtime Database,我想从Firebase实时数据库中获取所有节点,其中搜索结果与子值匹配。例如,考虑我下面的FixBASE结构: -Users -uid -uname:abc -usurname:xyz -uid -uname:abc -usurname:pqr -uid -uname:hij -usurname:x
-Users
-uid
-uname:abc
-usurname:xyz
-uid
-uname:abc
-usurname:pqr
-uid
-uname:hij
-usurname:xyz
我的搜索键是abc xyz
。我希望从-uname和-usurname中获得结果,以将用户显示为来自Firebase的匹配结果
我的代码:
Query query = FirebaseDatabase.getInstance().getReference("Users").orderByChild("uname").startAt(getInput).orderByChild("usurname").startAt(getInput);
query.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.e("app","found: "+snapshot.getValue());
}
public void onCancelled(@NonNull DatabaseError error) {
}
});
java.lang.IllegalArgumentException: You can't combine multiple orderBy calls!
at com.google.firebase.database.Query.validateNoOrderByCall(Query.java:134)
at com.google.firebase.database.Query.orderByChild(Query.java:609)
错误:
Query query = FirebaseDatabase.getInstance().getReference("Users").orderByChild("uname").startAt(getInput).orderByChild("usurname").startAt(getInput);
query.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.e("app","found: "+snapshot.getValue());
}
public void onCancelled(@NonNull DatabaseError error) {
}
});
java.lang.IllegalArgumentException: You can't combine multiple orderBy calls!
at com.google.firebase.database.Query.validateNoOrderByCall(Query.java:134)
at com.google.firebase.database.Query.orderByChild(Query.java:609)
如何在Java代码中为其编写查询?您必须创建另一个名为
uname\u usuername
的属性,该属性将包含两个值,然后您可以执行以下操作:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("users").orderByChild("uname_usuername").equalTo("abc_xyz");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
// do something with the data
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
您必须创建另一个名为
uname\u usuername
的属性,该属性将包含两个值,然后您可以执行以下操作:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("users").orderByChild("uname_usuername").equalTo("abc_xyz");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
// do something with the data
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
你可以这样做。我假设您已将搜索键拆分为两个字符串,即searchKey1和searchKey2,如下所示
String searchKey="abc xyz";
String[] str=searchKey.split(" ");
String searchKey1=str[0];
String searchKey2=str[1];
// OR YOU CAN SPLIT HOWEVER YOU WANT //
databaseReference.child("users").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
if(dataSnapshot1.child("uname").exists()&&dataSnapshot1.child("usurname").exists()) {
if(dataSnapshot1.child("uname").getValue().toString().equals(searchKey1)&&dataSnapshot1.child("usurname").getValue().toString().equals(searchKey2)) {
//Do What You Want To Do.
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
你可以这样做。我假设您已将搜索键拆分为两个字符串,即searchKey1和searchKey2,如下所示
String searchKey="abc xyz";
String[] str=searchKey.split(" ");
String searchKey1=str[0];
String searchKey2=str[1];
// OR YOU CAN SPLIT HOWEVER YOU WANT //
databaseReference.child("users").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
if(dataSnapshot1.child("uname").exists()&&dataSnapshot1.child("usurname").exists()) {
if(dataSnapshot1.child("uname").getValue().toString().equals(searchKey1)&&dataSnapshot1.child("usurname").getValue().toString().equals(searchKey2)) {
//Do What You Want To Do.
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
那是准确的搜索。它是否返回多个匹配的结果?是的,它将返回多个搜索,即如果uname和usurname在列表中匹配多次,则if条件将运行多次。如果在If块的最后一行添加break,那么它将仅第一次运行。好。如何限制前50个结果,然后在滚动时获得下一个50个结果?在if块中,将所有DataSnaphot存储在ArrayList中,然后一次获取50个,然后存储索引,然后在滚动时每次增加50个。这就是精确的搜索。它是否返回多个匹配的结果?是的,它将返回多个搜索,即如果uname和usurname在列表中匹配多次,则if条件将运行多次。如果在If块的最后一行添加break,那么它将仅第一次运行。好。如何在滚动时限制前50个结果,然后再获取下50个结果?在if块中,将所有DataSnaphot存储在ArrayList中,然后一次获取50个结果,然后存储索引,然后在滚动时每次将其递增50。