Java 如何避免firebase实时数据库中的重复数据
我目前正在开发一个Android应用程序,我使用firebase(实时功能)作为后端服务。此外,我开发了这个函数,如下所示Java 如何避免firebase实时数据库中的重复数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我目前正在开发一个Android应用程序,我使用firebase(实时功能)作为后端服务。此外,我开发了这个函数,如下所示 private void checkUserExisting (){ Dataa = mRef.getReference().child("Users"); Dataa.addListenerForSingleValueEvent(new ValueEventListener() { @Override public voi
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) {
}
});
private void checkUserExisting(){
Dataa=mRef.getReference().child(“用户”);
Dataa.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
如果(!dataSnapshot.exists()){
CreateUserProfile();
}否则{
最后一个字符串Uname=name.getText().toString().trim();
最终字符串Email=emailAddress.getText().toString().trim();
迭代器dataSnapshots=dataSnapshot.getChildren().Iterator();
while(dataSnapshots.hasNext())
{
DataSnapshot dataSnapshotChild=dataSnapshots.next();
字符串EmailAddress=dataSnapshotChild.child(“电子邮件”).toString();
字符串UserName=dataSnapshotChild.child(“用户名”).toString();
if(Uname.equals(用户名)| | Email.equals(EmailAddress)){
Toast.makeText(Sgin_Up.this,“此用户已存在”,Toast.LENGTH_LONG.show();
打破
}否则{
CreateUserProfile();
}
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
扩展
代码运行得很好,它检查现有数据并显示Toast消息,但在数据仍进入数据库后,我希望作废重复数据。创建新帐户或注册过程时,您可以检查用户是否已存在,例如:
.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.
}
})
如果电子邮件存在,则会返回数据,如果数据库中没有该电子邮件的用户。您现在正在循环内部创建。这意味着每次它发现一个不适合该新用户的节点时都会发生。这显然不是您想要的,因为只有在没有任何节点与新用户匹配时才应创建新配置文件。因此它必须在循环之外:
public void onDataChange(DataSnapshot dataSnapshot) {
bool foundUser = false;
final String Uname = name.getText().toString().trim();
final String Email = emailAddress.getText().toString().trim();
Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator();
while (!foundUser && 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();
foundUser = true;
}
}
if (!foundUser){
CreateUserProfile();
}
}
public void onDataChange(DataSnapshot DataSnapshot){
bool foundUser=false;
最后一个字符串Uname=name.getText().toString().trim();
最终字符串Email=emailAddress.getText().toString().trim();
迭代器dataSnapshots=dataSnapshot.getChildren().Iterator();
而(!foundUser&&dataSnapshots.hasNext()){
DataSnapshot dataSnapshotChild=dataSnapshots.next();
字符串EmailAddress=dataSnapshotChild.child(“电子邮件”).toString();
字符串UserName=dataSnapshotChild.child(“用户名”).toString();
if(Uname.equals(用户名)| | Email.equals(EmailAddress)){
Toast.makeText(Sgin_Up.this,“此用户已存在”,Toast.LENGTH_LONG.show();
foundUser=true;
}
}
如果(!foundUser){
CreateUserProfile();
}
}
考虑到电子邮件地址是唯一的,您可以通过运行单个查询轻松解决该问题,该查询将检查数据库中是否存在电子邮件,并在注册过程中防止使用相同的电子邮件创建帐户。如果(dataSnapshotChild.child(“电子邮件”).exists(){}这可以解决@YUPIT电子邮件变量存在的问题,我需要将数据与注册阶段填写的数据进行比较,如果它们太多,我需要通过异常来防止和避免重复数据更新答案。我没有使用Firebase身份验证功能,我认为这将不适合我的问题。我从您那里知道吗get FoundChildern variableWoops..这是一个错误。修复了它。嗨,Frank,在这种情况下,函数甚至不检查输入的数据。我(有意)对此没有做任何更改,只是简化了代码并删除了多余的写入。如果你现在在调试器中单步执行它,哪一行不符合你的预期?
public void onDataChange(DataSnapshot dataSnapshot) {
bool foundUser = false;
final String Uname = name.getText().toString().trim();
final String Email = emailAddress.getText().toString().trim();
Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator();
while (!foundUser && 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();
foundUser = true;
}
}
if (!foundUser){
CreateUserProfile();
}
}