Android Studio firebase数据库在添加新值之前等待读取

时间:2017-03-04 13:49:31

标签: java android firebase firebase-realtime-database

我有一个数据库,我在其中存储用户,我想在添加新用户之前检查用户是否存在,因此我不会覆盖。

我有一个遍历数据库记录的函数,如果找到或找不到用户,则返回一个布尔值。

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有一个叫做事务处理程序的东西,我认为这就是我需要使用的东西,但文档并没有帮助我,而且我已经看过其他人要求它们的相同之处这里有问题,但无法找到解决方案,所以,如果你能解释如何做到这一点而不是将我转到其他问题,我将不胜感激。

2 个答案:

答案 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;
}

虽然我建议你通过创建单独的函数来重构这个。 :)