检查用户是否已经存在于Firebase实时数据库中

时间:2018-08-09 17:26:55

标签: android firebase firebase-realtime-database

我得到Alex Mamo's Solution以便检查数据库中是否存在唯一值,但是快照始终为空。解决方案在这里:

var platformData = ["XBOX", "PS4", "PC"]
var picker = UIPickerView()

@IBOutlet var platformSelected: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    picker.delegate = self
    picker.dataSource = self
    platformSelected.inputView = picker

    let toolbar = UIToolbar()
    toolbar.sizeToFit()
    let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneAction))
    toolbar.items = [doneButton]
    platformSelected.inputAccessoryView = toolbar

}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return platformData.count
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    platformSelected.text = platformData[row]
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return platformData[row]
}

我的数据库如下:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("Users").child("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(!dataSnapshot.exists()) {
        //create new user
    }
}

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
userNameRef.addListenerForSingleValueEvent(eventListener);

我不知道这是否是正确的方法,但是我使用push()方法将用户对象添加到数据库中,并且该方法生成如上所述的推送令牌ID。

因此,为了不创建重复用户,上述解决方案应该更改什么?有更好的方法吗?也许喜欢使用一些Firebase身份验证方法检查Firebase uid?

更新 我的数据库截图: database 如您所见,“用户”下面的字符串与用户的uid不同。

2 个答案:

答案 0 :(得分:3)

如果您有此数据库:

users
(auto-generated push token ID)
    fullname
    username
    gender

然后要检查用户是否存在,您需要执行以下操作:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("users");
Query queries=userNameRef.orderByChild("fullname").equalTo("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
  @Override
public void onDataChange(DataSnapshot dataSnapshot) {
   if(!dataSnapshot.exists()) {
       //create new user
    }
 }

    @Override
   public void onCancelled(DatabaseError databaseError) {}
};
queries.addListenerForSingleValueEvent(eventListener);

首先,如果您拥有users小写字母,然后在子对象中添加users,那么您需要使用查询来检查全名是否等于Nick123。


通常,数据库的结构如下:

users
  userId
     fullname: Nick123

属性是key:value,键是标识符,而Nick123是值,因此在child()方法内部,您需要编写标识符fullname而不是Nick123。 / p>

然后,由于您能够获取userId,因此可以执行以下操作:

FirebaseUser currentFirebaseUser =FirebaseAuth.getInstance().getCurrentUser();
String userId=currentFirebaseUser.getUid();
 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("users").child(uid).child("fullname");
userNameRef.addValueEventListener(new ValueEventListener(){...}

答案 1 :(得分:2)

这不是将用户详细信息保存到数据库中的最佳实践。首先,您应该实现Firebase Authentication,然后为了检查数据库中是否存在用户,应使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(!dataSnapshot.exists()) {
        //create new user
    }
}

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);

因此,解决此问题的关键是调用child()方法并传递uid作为参数,而不是调用生成随机唯一标识符的push()方法。