Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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
Android 如何使用两个子值在Firebase中搜索?_Android_Database_Firebase_Android Studio_Firebase Realtime Database - Fatal编程技术网

Android 如何使用两个子值在Firebase中搜索?

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

我想从Firebase实时数据库中获取所有节点,其中搜索结果与子值匹配。例如,考虑我下面的FixBASE结构:

    -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。