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

标签 java android firebase-realtime-database firebase-authentication

成功创建新用户帐户后,使用 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/

相关文章:

java - 合理 `instanceof` ?将其与接口(interface)一起使用,但不与实现类型一起使用

用 JavaScript 编写的 Java 解析器

java - 如何使用 YourKit 分析 Domino Agents (AMgr)?

java - BluetoothSocket OutputStream.write() 问题

java - 将日期从 EditText 解析到 Calendar 并从中计算年龄

java - 无法在我的 firebase 数据库中获取 Children

java - 使用 Java API 生成属性文件时,为什么冒号会用反斜杠转义?

android - 如何使用 CPU 在深度 sleep 模式下执行任何操作

android - 在 Firebase UI 中开始监听

javascript - 以编程方式将字段添加到 angularfire 并与 Firebase 同步