检查Firebase数据库中特定位置是否存在特定值

时间:2018-10-13 07:50:42

标签: java firebase-realtime-database

enter image description here

这是我的数据库。我想在添加之前检查是否存在特定的uid,以便避免相同uid的重复条目。这是我的代码。它检查uid是否存在,然后返回一个布尔值。在另一种方法中将其解析为if语句以添加联系人。但是,即使uid已存在于联系人中,此方法也仅返回false。因此,允许添加相同的条目。

enter image description here

检查联系人是否存在的方法。

 public void addContacts(final String emailInput){
    DatabaseReference users;

    users = FirebaseDatabase.getInstance().getReference("users");
    users.orderByChild("email").equalTo(emailInput).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
            for (DataSnapshot emailSnapshot : dataSnapshot.getChildren()) {
                String emailData = emailSnapshot.child("email").getValue(String.class);
                final String name = emailSnapshot.child("name").getValue(String.class);
                String role = emailSnapshot.child("role").getValue(String.class);
                if (emailData.equals(emailInput)){
                    key = emailSnapshot.getKey();
                    System.out.println(key);
                    if ((!role.equals(userRole))) {
                        DatabaseReference contactRef = ref.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("contacts").child(key);
                        contactRef.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if (!dataSnapshot.child(key).exists()) {
                                    ContactProfile newContact = new ContactProfile(key, name);
                                    ref.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("contacts").push().setValue(newContact);
                                    Toast.makeText(Contacts.this, "Contact Added Successfully", Toast.LENGTH_SHORT).show();
                                }
                                else {
                                    Toast.makeText(Contacts.this, "Contact Already Exists", Toast.LENGTH_SHORT).show();
                                }
                            }
                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });
                    }
                    else if(key.equals(FirebaseAuth.getInstance().getCurrentUser().getUid())){
                        Toast.makeText(Contacts.this, "You cannot add yourself",Toast.LENGTH_SHORT).show();
                    }
                    else{
                        Toast.makeText(Contacts.this, "Cannot add user. \n They have the same role",
                                Toast.LENGTH_SHORT).show();
                    }
                }
                else {
                    Toast.makeText(Contacts.this, "Cannot add user. \n User does not exist",
                            Toast.LENGTH_SHORT).show();
                }
            }
        }

3 个答案:

答案 0 :(得分:0)

尽管我对firebase一无所知,但可能由于您使用的是方法内部类而出现问题,因此值的范围不在此赋值之内,而您又在方法内部类之外进行比较,因此该值= 1不会发生,它将始终是value = 0,所以条件永远不会为真。

答案 1 :(得分:0)

尝试一下...

DatabaseReference contactRef = userRef.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("contacts").child(key);
 @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists()) {
           value = 1;
        }
    }

答案 2 :(得分:0)

从Firebase异步加载数据。如果放置一些日志语句,最容易了解这意味着什么:

System.out.println("Before attaching listener");
contactRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        System.out.println("Got data");
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});
System.out.println("After attaching listener");

运行此代码时,它会打印:

  

在附加侦听器之前

     

附加监听器后

     

获得数据

这可能不是您所期望的,但是它恰好说明了代码无法正常工作的原因:到您检查if (value.equals(1)){时,onDataChange方法还没有运行。

如您所见,我们无法return从数据库中获取值。 onDataChange之外的任何return语句将在数据加载之前 运行。并且我们在return中运行的任何onDataChange语句将无法将数据返回给调用函数。

最快的解决方案是将所有需要数据的代码移入 onDataChange方法:

private boolean contactExists(final String key){
    DatabaseReference userRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference contactRef = userRef.child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("contacts").child(key);
    contactRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                ... do what we need to do is the key exists
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
             throw databaseError.toException(); // don't ignore errors
        }
    });
}

如果您想使该方法更具可重用性,则可以定义自己的回调接口,并将其传递到contactExists中。有关此示例,请在这里查看我的答案:getContactsFromFirebase() method return an empty list