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