android firebase:firebase数据库中的不相等查询

android firebase:firebase数据库中的不相等查询,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我的用户对象如下: { "deviceTokens" : { "SgJd7o1hK7YbJnygnYWvaz4qkr42" : { "c-sfcTB3iEA:APA91bEvuzhX1nlrhoxVmR69lvwu0H1zyRjOXd5b14LngObuj8WeHkmlel6AOyrU7B2alBO1vW0pIO4gXGurvz5llCloyYpQv7vCq0_3fVEhmrIGfJ2S13TiXqVLJgWUCs95_AYZlysj" : true, "cn

我的用户对象如下:

{
  "deviceTokens" : {
    "SgJd7o1hK7YbJnygnYWvaz4qkr42" : {
      "c-sfcTB3iEA:APA91bEvuzhX1nlrhoxVmR69lvwu0H1zyRjOXd5b14LngObuj8WeHkmlel6AOyrU7B2alBO1vW0pIO4gXGurvz5llCloyYpQv7vCq0_3fVEhmrIGfJ2S13TiXqVLJgWUCs95_AYZlysj" : true,
      "cnQdyuxBgz0:APA91bFZTPEFrl1Vf9Nw9ZvdtNsW1ll3YYq8WIwT799NVTp6S281v56UVJ3lo0kDK_rFZfoHuarX9Qb8NL8TJXi9A_jH4RhbDp3ecbW-tHdrYR06PwYdSiMfRjIxJOuPtHuqy0TNOw4K" : true,
      "d3D81crwy0E:APA91bEoAeWiOwm73bt2DvNNdv_NUn0PwjQcLa6z8ZYjDyuHWsNeDPVDCXOATKB5AFoBb7iOW6kgzU41oYFqHYek1Cngv6ArsrZO0crq_bV3PzfQxKvRN8xYX1_WryaR2tpAVP_4czgx" : true,
      "dHBaxzKqhMw:APA91bGmQ5KhxiaE48_IQHEJVpvpvQdXUgAd_a1reJiyh4Z5W6dhNZB4KesaQuiRrj-VLxdCvxIroH3a-75zUaYd6_yLtoCzNfNGT8EWqUrtC3FSibOA_cwPye09C001zfFe_pHv6Wph" : true,
      "dz8wf231cXE:APA91bEAmfPu4QWRstKE5kqtN-UtgNpOIG7KWxsjFB1oIOp9cKhoWfbnpsvMTd3YgNw09jVNK6lUgKXMNt4AND0cZGcepkqQyZTDNh5KA5SU9KbbD7MJzxGhwGhGlFV-4hiOOhumoRxs" : true
    }
  },
  "users" : {
    "SgJd7o1hK7YbJnygnYWvaz4qkr42" : {
      "displayName" : "Chintan Soni",
      "email" : "chintansoni202@gmail.com",
      "photoUrl" : "https://lh5.googleusercontent.com/-JNfSscqwEng/AAAAAAAAAAI/AAAAAAAADbs/dj7t_7AYlzo/s96-c/photo.jpg"
    }
  }
}
我可以使用以下方式查询用户对象:

mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("users");

我想知道是否还有什么可以质疑不平等性的。我想查询用户的子密钥与我的FirebaseUser UID不匹配,这意味着我想获取除我之外的用户记录。

实际上,我不想创建自己的适配器,因为我相信FirebaseUI不会有这样的限制,但我错了。 不管怎么说,我就是这样做的:

首先,从FirebaseDatabase获取用户对象中的所有数据,然后在我们这端进行筛选,最后设置该数据:

FirebaseDatabase.getInstance().getReference().child("users")
   .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> list = dataSnapshot.getChildren();

            // Getting current user Id
            String uid = getCurrentUserId();

            // Filter User
            List<User> userList = new ArrayList<>();
            for (DataSnapshot dataSnapshot1 : list) {
                if (!dataSnapshot1.getKey().equals(uid)) {
                    userList.add(dataSnapshot1.getValue(User.class));
                }
            }

            // Setting data
            mBaseRecyclerAdapter.setItems(userList);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
FirebaseDatabase.getInstance().getReference().child(“用户”)
.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable list=dataSnapshot.getChildren();
//正在获取当前用户Id
字符串uid=getCurrentUserId();
//过滤用户
List userList=new ArrayList();
对于(DataSnapshot dataSnapshot1:list){
如果(!dataSnapshot1.getKey().equals(uid)){
添加(dataSnapshot1.getValue(User.class));
}
}
//设置数据
mBaseRecyclerAdapter.setItems(用户列表);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
我在这里创建了自己的通用回收器适配器:

实际上,我不想创建自己的适配器,因为我相信FirebaseUI不会有这样的限制,但我错了。 不管怎么说,我就是这样做的:

首先,从FirebaseDatabase获取用户对象中的所有数据,然后在我们这端进行筛选,最后设置该数据:

FirebaseDatabase.getInstance().getReference().child("users")
   .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> list = dataSnapshot.getChildren();

            // Getting current user Id
            String uid = getCurrentUserId();

            // Filter User
            List<User> userList = new ArrayList<>();
            for (DataSnapshot dataSnapshot1 : list) {
                if (!dataSnapshot1.getKey().equals(uid)) {
                    userList.add(dataSnapshot1.getValue(User.class));
                }
            }

            // Setting data
            mBaseRecyclerAdapter.setItems(userList);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
FirebaseDatabase.getInstance().getReference().child(“用户”)
.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable list=dataSnapshot.getChildren();
//正在获取当前用户Id
字符串uid=getCurrentUserId();
//过滤用户
List userList=new ArrayList();
对于(DataSnapshot dataSnapshot1:list){
如果(!dataSnapshot1.getKey().equals(uid)){
添加(dataSnapshot1.getValue(User.class));
}
}
//设置数据
mBaseRecyclerAdapter.setItems(用户列表);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
我在这里创建了自己的通用回收器适配器:

解决此问题的一种方法是,通过如下方式扩展FirebaseArray,并继续使用FirebaseUI中的FirebaseRecyclerAdapter:

import com.firebase.ui.database.FirebaseArray;
import com.firebase.ui.database.SnapshotParser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.Query;

import java.util.HashSet;
import java.util.Set;

public class FilterableFirebaseArray extends FirebaseArray {

    private Set<String> excludes = new HashSet<>();

    public FilterableFirebaseArray(Query query, Class aClass) {
        super(query, aClass);
    }

    public FilterableFirebaseArray(Query query, SnapshotParser parser) {
        super(query, parser);
    }

    public void addExclude(String key) {
        excludes.add(key);
    }

    public void removeExclude(String key) {
        excludes.remove(key);
    }

    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildAdded(snapshot, excludes.contains(previousChildKey)? null : previousChildKey);
        }
    }

    @Override
    public void onChildChanged(DataSnapshot snapshot, String previousChildKey) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildChanged(snapshot, excludes.contains(previousChildKey)? null : previousChildKey);
        }
    }

    @Override
    public void onChildMoved(DataSnapshot snapshot, String previousChildKey) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildMoved(snapshot, excludes.contains(previousChildKey)? null : previousChildKey);
        }
    }

    @Override
    public void onChildRemoved(DataSnapshot snapshot) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildRemoved(snapshot);
        }
    }

}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView userListView = (RecyclerView) findViewById(R.id.userList);
    userListView.setLayoutManager(new LinearLayoutManager(this));

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    Query query = ref.orderByValue();
    ClassSnapshotParser parser = new ClassSnapshotParser<UserProfile>(UserProfile.class);
    FilterableFirebaseArray filterableFirebaseArray = new FilterableFirebaseArray(query, parser);

    filterableFirebaseArray.addExclude(FirebaseAuth.getInstance().getCurrentUser().getUid());

    FirebaseRecyclerAdapter mAdapter = new FirebaseRecyclerAdapter<UserProfile, UserListEntryHolder>(
            filterableFirebaseArray,
            R.layout.userlist_entry,
            UserListEntryHolder.class) {
        @Override
        protected void populateViewHolder(UserListEntryHolder viewHolder, UserProfile model, int position) {
            viewHolder.bind(model);
        }
    };
    userListView.setAdapter(mAdapter);
}
override fun onStart() {
    super.onStart()
    if (currentUser != null) {
        userList.adapter = getAdapter()
    }
}

private fun getAdapter(): FirebaseRecyclerAdapter<UserProfile, UserListEntryHolder> {

    val query = userProfilesReference.orderByValue()
    val parser = ClassSnapshotParser<UserProfile>(UserProfile::class.java)
    val filterableFirebaseArray = FilterableFirebaseArray<UserProfile>(query, parser)

    filterableFirebaseArray.excludes.add(currentUser?.uid)

    return object : FirebaseRecyclerAdapter<UserProfile, UserListEntryHolder>(
            filterableFirebaseArray,
            R.layout.userlist_entry,
            UserListEntryHolder::class.java) {
        public override fun populateViewHolder(entryHolder: UserListEntryHolder, userProfile: UserProfile, position: Int) {
            entryHolder.bind(userProfile)
        }
    }
}
导入com.firebase.ui.database.FirebaseArray;
导入com.firebase.ui.database.SnapshotParser;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.Query;
导入java.util.HashSet;
导入java.util.Set;
公共类FilterableFirebaseArray扩展FirebaseArray{
private Set excludes=new HashSet();
公共FilterableFirebaseArray(查询,类aClass){
super(查询,aClass);
}
公共FilterableFirebaseArray(查询、快照解析器){
super(查询、解析器);
}
公共无效addExclude(字符串键){
不包括。添加(键);
}
公共void removeExclude(字符串键){
排除。删除(键);
}
@凌驾
公共void onChildAdded(DataSnapshot快照,字符串previousChildKey){
如果(!excludes.contains(snapshot.getKey())){
super.onChildAdded(快照,排除.contains(previousChildKey)?null:previousChildKey);
}
}
@凌驾
公共void onChildChanged(DataSnapshot快照,字符串previousChildKey){
如果(!excludes.contains(snapshot.getKey())){
super.onChildChanged(快照,排除.contains(previousChildKey)?null:previousChildKey);
}
}
@凌驾
public void onChildMoved(DataSnapshot快照,字符串previousChildKey){
如果(!excludes.contains(snapshot.getKey())){
super.onChildMoved(快照,排除.contains(previousChildKey)?null:previousChildKey);
}
}
@凌驾
公共void onChildRemoved(DataSnapshot快照){
如果(!excludes.contains(snapshot.getKey())){
super.onChildRemoved(快照);
}
}
}
…然后像这样使用它:

import com.firebase.ui.database.FirebaseArray;
import com.firebase.ui.database.SnapshotParser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.Query;

import java.util.HashSet;
import java.util.Set;

public class FilterableFirebaseArray extends FirebaseArray {

    private Set<String> excludes = new HashSet<>();

    public FilterableFirebaseArray(Query query, Class aClass) {
        super(query, aClass);
    }

    public FilterableFirebaseArray(Query query, SnapshotParser parser) {
        super(query, parser);
    }

    public void addExclude(String key) {
        excludes.add(key);
    }

    public void removeExclude(String key) {
        excludes.remove(key);
    }

    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildAdded(snapshot, excludes.contains(previousChildKey)? null : previousChildKey);
        }
    }

    @Override
    public void onChildChanged(DataSnapshot snapshot, String previousChildKey) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildChanged(snapshot, excludes.contains(previousChildKey)? null : previousChildKey);
        }
    }

    @Override
    public void onChildMoved(DataSnapshot snapshot, String previousChildKey) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildMoved(snapshot, excludes.contains(previousChildKey)? null : previousChildKey);
        }
    }

    @Override
    public void onChildRemoved(DataSnapshot snapshot) {
        if (!excludes.contains(snapshot.getKey())) {
            super.onChildRemoved(snapshot);
        }
    }

}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView userListView = (RecyclerView) findViewById(R.id.userList);
    userListView.setLayoutManager(new LinearLayoutManager(this));

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    Query query = ref.orderByValue();
    ClassSnapshotParser parser = new ClassSnapshotParser<UserProfile>(UserProfile.class);
    FilterableFirebaseArray filterableFirebaseArray = new FilterableFirebaseArray(query, parser);

    filterableFirebaseArray.addExclude(FirebaseAuth.getInstance().getCurrentUser().getUid());

    FirebaseRecyclerAdapter mAdapter = new FirebaseRecyclerAdapter<UserProfile, UserListEntryHolder>(
            filterableFirebaseArray,
            R.layout.userlist_entry,
            UserListEntryHolder.class) {
        @Override
        protected void populateViewHolder(UserListEntryHolder viewHolder, UserProfile model, int position) {
            viewHolder.bind(model);
        }
    };
    userListView.setAdapter(mAdapter);
}
override fun onStart() {
    super.onStart()
    if (currentUser != null) {
        userList.adapter = getAdapter()
    }
}

private fun getAdapter(): FirebaseRecyclerAdapter<UserProfile, UserListEntryHolder> {

    val query = userProfilesReference.orderByValue()
    val parser = ClassSnapshotParser<UserProfile>(UserProfile::class.java)
    val filterableFirebaseArray = FilterableFirebaseArray<UserProfile>(query, parser)

    filterableFirebaseArray.excludes.add(currentUser?.uid)

    return object : FirebaseRecyclerAdapter<UserProfile, UserListEntryHolder>(
            filterableFirebaseArray,
            R.layout.userlist_entry,
            UserListEntryHolder::class.java) {
        public override fun populateViewHolder(entryHolder: UserListEntryHolder, userProfile: UserProfile, position: Int) {
            entryHolder.bind(userProfile)
        }
    }
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView userListView=(RecyclerView)findViewById(R.id.userList);
setLayoutManager(新的LinearLayoutManager(this));
DatabaseReference ref=FirebaseDatabase.getInstance().getReference();
Query Query=ref.orderByValue();
ClassSnapshotParser=新的ClassSnapshotParser(UserProfile.class);
FilterableFirebaseArray FilterableFirebaseArray=新的FilterableFirebaseArray(查询,解析器);
filterableFirebaseArray.addExclude(FirebaseAuth.getInstance().getCurrentUser().getUid());
FirebaseRecyclerAdapter mAdapter=新的FirebaseRecyclerAdapter(
filterableFirebaseArray,
R.layout.userlist_条目,
UserListEntryHolder.class){
@凌驾
受保护的void populateViewHolder(UserListEntryHolder viewHolder、UserProfile模型、int位置){
viewHolder.bind(模型);
}
};
setAdapter(mAdapter);
}
“魔法”发生在重写的onchildaded方法中,我们忽略由指定键标识的子级。在本例中,我只是将当前用户的UID添加到排除列表中。因为这符合我的数据库设计

您可以轻松地扩展该功能以忽略具有特定