Java 处理Firebase身份验证和数据库实时之间事务的最佳方法

Java 处理Firebase身份验证和数据库实时之间事务的最佳方法,java,android,firebase-realtime-database,firebase-authentication,Java,Android,Firebase Realtime Database,Firebase Authentication,当使用Firebase身份验证成功创建新用户帐户时,我尝试再次请求在Firebase数据库中创建他的个人资料(姓名、电子邮件和电话),但如果第二次请求失败,我将有一个没有个人资料的用户,这种情况不可能发生,由于他在登录时无法编辑他的个人资料,因此目前我正在Firebase Auth中删除这个最近创建的用户,以允许他重试创建,但这并不能解决问题,因为删除请求也可能失败。在Firebase中处理事务的最佳方式是什么,成功创建用户和他的个人资料,还是不创建 private void attemptT

当使用Firebase身份验证成功创建新用户帐户时,我尝试再次请求在Firebase数据库中创建他的个人资料(姓名、电子邮件和电话),但如果第二次请求失败,我将有一个没有个人资料的用户,这种情况不可能发生,由于他在登录时无法编辑他的个人资料,因此目前我正在Firebase Auth中删除这个最近创建的用户,以允许他重试创建,但这并不能解决问题,因为删除请求也可能失败。在Firebase中处理事务的最佳方式是什么,成功创建用户和他的个人资料,还是不创建

 private void attemptToCreateAccount(final Credentials cred) {
        getCompositeDisposable().add(
                getAuthService().createAccount(cred)
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribeWith(new DisposableSingleObserver<User>() {
                            @Override
                            public void onSuccess(User user) {
                                 addUserProfileToDatabase(user.getEmail(), user.getUserUid(), cred.getUsername(), cred.getPassword());
                            }

                            @Override
                            public void onError(Throwable e) {
                                getView().showMessage(e.toString());
                            }
                        })
        );
    }

--------------------------

 private void addUserProfileToDatabase(final String email, final String userUid, final String name, final String password) {
        final Profile profile = new Profile("", "", "", email, "", name);
        getCompositeDisposable().add(
                getDatabaseSource().createNewProfileToUser(userUid, profile)
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribeWith(new DisposableCompletableObserver(){
                    @Override
                    public void onComplete() {
                        getView().saveUserData(userUid, email, name);
                        getView().goToProfilePageActivity();
                    }

                    @Override
                    public void onError(Throwable e) {
                        // TODO RETRY OPERATION OR DELETE THE CURRENT CREATED USER
                        getView().showMessage(e.getLocalizedMessage());
                        deleteUserCreatedWithoutProfile(email, password);
                    }
                })
        );
    }

    --------------------------

private void deleteUserCreatedWithoutProfile(String email, String password){
        getCompositeDisposable().add(
                getDatabaseSource().deleteUser(email, password)
                .observeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribeWith(new DisposableCompletableObserver(){

                    @Override
                    public void onComplete() {
                        Log.e("FIREBASE", "user deleted because profile could not be created successfully");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("FIREBASE", "Houston We have a problem. User was created without a profile.");
                    }
                })
        );
    }
private void试图创建帐户(最终凭据凭据凭据){
getCompositeDisposable().add(
getAuthService().CreateCount(cred)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribowith(新的可处置SingleObserver(){
@凌驾
成功时公共无效(用户){
addUserProfileToDatabase(user.getEmail()、user.getUserUid()、cred.getUsername()、cred.getPassword());
}
@凌驾
公共无效申报人(可丢弃的e){
getView().showMessage(例如toString());
}
})
);
}
--------------------------
私有void addUserProfileToDatabase(最终字符串电子邮件、最终字符串userUid、最终字符串名称、最终字符串密码){
最终配置文件=新配置文件(“,”,“,电子邮件,”,名称);
getCompositeDisposable().add(
getDatabaseSource().createNewProfileToUser(userUid,配置文件)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribowith(新的可处置CompletableObserver(){
@凌驾
未完成的公共空间(){
getView().saveUserData(userUid、电子邮件、名称);
getView().goToProfilePageActivity();
}
@凌驾
公共无效申报人(可丢弃的e){
//TODO重试操作或删除当前创建的用户
getView().showMessage(如getLocalizedMessage());
deleteUserCreatedWithoutProfile(电子邮件、密码);
}
})
);
}
--------------------------
私有void deleteUserCreatedWithoutProfile(字符串电子邮件、字符串密码){
getCompositeDisposable().add(
getDatabaseSource().deleteUser(电子邮件、密码)
.observeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribowith(新的可处置CompletableObserver(){
@凌驾
未完成的公共空间(){
Log.e(“FIREBASE”,“由于无法成功创建配置文件而删除用户”);
}
@凌驾
公共无效申报人(可丢弃的e){
Log.e(“FIREBASE”,“Houston,我们有一个问题。用户创建时没有配置文件。”);
}
})
);
}

不需要FirebaseDatabase,您可以在此处存储用户信息firebaseAuth也可以这样做

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg"))
        .build();

user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User profile updated.");
                }
            }
        });
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
UserProfileChangeRequest profileUpdates=新建UserProfileChangeRequest.Builder()
.setDisplayName(“Jane Q.User”)
.setPhotoUri(Uri.parse(“https://example.com/jane-q-user/profile.jpg"))
.build();
user.updateProfile(profileUpdates)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Log.d(标签“用户配置文件更新”);
}
}
});

有关更多信息,请访问此

我没有使用FirebaseAuth,因为我可能需要保存一些默认情况下不存在的信息,如phoneNumber和CellPhoneNumber