我目前正在开发一个Android应用程序,该应用程序将Firebase(实时功能)用作后端服务。另外,我已经开发了此功能,如下所示。
private void checkUserExisting (){
Dataa = mRef.getReference().child("Users");
Dataa.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()){
CreateUserProfile();
}else {
final String Uname = name.getText().toString().trim();
final String Email = emailAddress.getText().toString().trim();
Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator();
while (dataSnapshots.hasNext())
{
DataSnapshot dataSnapshotChild = dataSnapshots.next();
String EmailAddress = dataSnapshotChild.child("Email").toString();
String UserName = dataSnapshotChild.child("UserName").toString();
if (Uname.equals(UserName) || Email.equals(EmailAddress)){
Toast.makeText(Sgin_Up.this,"This user already exists",Toast.LENGTH_LONG).show();
break;
}else {
CreateUserProfile();
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
扩展 该代码工作得很好,并且它检查现有数据并显示Toast消息,但是在数据仍然进入数据库后,我想使重复数据无效。
答案 0 :(得分:1)
在创建新帐户或注册过程时,您可以检查用户是否已经存在,例如:
.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
//retruns true if user is new
//false if user exits, move on login screen/forgot password etc.
}
})
并且您已阻止使用相同的电子邮件地址创建帐户,这实际上使数据库中是否存在email
地址的不必要检查,因为无法再使用相同的email
地址创建新帐户。
如果您仍要检查数据库中电子邮件地址的存在,则可以运行简单查询:
databaseReference.orderByChild("Email").equalTo(email).addListenerForSingleValueEvent....
如果存在电子邮件,则返回数据,如果不存在则数据库中没有该电子邮件的用户。
答案 1 :(得分:1)
您现在正在循环内创建。这意味着它会发生,每次都会找到一个不适合该新用户的节点。这显然不是您想要的,因为仅当节点的 none 与新用户匹配时才创建新的配置文件。所以它必须在循环之外:
df.repartition($"ss_item_sk").write.partitionBy("ss_item_sk").json(savepath)