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