我有一个数据库,我在其中存储用户,我想在添加新用户之前检查用户是否存在,因此我不会覆盖。
我有一个遍历数据库记录的函数,如果找到或找不到用户,则返回一个布尔值。
public boolean checkUserExists(final String emailAddress, final String emailDomain){
DatabaseReference myRef = database.getReference("Users");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot mydata : dataSnapshot.getChildren()){
User user = mydata.getValue(User.class);
if (user.getEmailAddress().equals(emailAddress) &&
user.getEmailDomain().equals(emailDomain)){
userExists = true;
break;
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userExists;
}
我目前正在尝试进行检查的方式如下:
if (!(registerRepo.checkUserExists(emailAddress, emailDomain))){
User user = new User(firsName, lastName, emailAddress, emailDomain);
registerRepo.writeUser(user);
} else {
Toast toast = Toast.makeText(getBaseContext(), "User exists", Toast.LENGTH_SHORT);
toast.show();
}
问题在于它不会等待读取并继续创建新记录(我使用push进行创建,因此它会在新的推送ID下创建相同的记录)。我已经看到firebase有一个叫做事务处理程序的东西,我认为这就是我需要使用的东西,但文档并没有帮助我,而且我已经看过其他人要求它们的相同之处这里有问题,但无法找到解决方案,所以,如果你能解释如何做到这一点而不是将我转到其他问题,我将不胜感激。
答案 0 :(得分:1)
Firebase请求是异步的。
因此,如果您想在从数据库获取结果后执行某些代码,则需要在checkUserExists
中添加回调。
例如:
public interface OnCheckUserExist {
void exist();
void notExist();
}
registerRepo.checkUserExists(emailAddress, emailDomain, new OnCheckUserExist(){
@Override
public void exist(){
Toast toast = Toast.makeText(getBaseContext(), "User exists",Toast.LENGTH_SHORT);
toast.show();
}
@Override
public void notExist(){
User user = new User(firsName, lastName, emailAddress, emailDomain);
registerRepo.writeUser(user);
}
})
public void checkUserExists(final String emailAddress, final String emailDomain, OnCheckUserExist onCheckUserExist){
DatabaseReference myRef = database.getReference("Users");
myRef.addValueEventListener(new ValueEventListener() {
boolean userExist;
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot mydata : dataSnapshot.getChildren()){
User user = mydata.getValue(User.class);
if (user.getEmailAddress().equals(emailAddress) &&
user.getEmailDomain().equals(emailDomain)){
onCheckUserExist.exist();
userExist = true;
break;
}
}
if (!userExist){
onCheckUserExist.notExist();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
答案 1 :(得分:0)
您需要将代码放在onDataChange中,就像这样
public boolean checkUserExists(final String emailAddress, final String emailDomain){
DatabaseReference myRef = database.getReference("Users");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot mydata : dataSnapshot.getChildren()){
User user = mydata.getValue(User.class);
if (user.getEmailAddress().equals(emailAddress) &&
user.getEmailDomain().equals(emailDomain)){
userExists = true;
break;
}
}
if (userExists) {
User user = new User(firsName, lastName, emailAddress, emailDomain);
registerRepo.writeUser(user);
} else {
Toast toast = Toast.makeText(getBaseContext(), "User exists", Toast.LENGTH_SHORT);
toast.show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userExists;
}
虽然我建议你通过创建单独的函数来重构这个。 :)