成功创建新用户帐户后,使用 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.");
}
})
);
}
最佳答案
不需要 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.");
}
}
});
有关更多信息,请访问此 link
关于java - 处理 Firebase 身份验证和数据库实时事务之间的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753684/