【问题标题】:Android: Firebase DB query for username, create new user record if username does not existAndroid:Firebase DB查询用户名,如果用户名不存在则创建新用户记录
【发布时间】:2018-01-22 16:38:16
【问题描述】:

我有一个注册表单(用户名、密码、电话号码)和一个提交按钮。我想检查这个用户名之前是否已经注册过。如果不是,则在表单中创建具有凭据的用户。

数据库结构

- 用户
--- -L3HQjgyXe6iNC0r0Ftr
------ 手机:“+15553334444”
------ 密码:“悠悠”
------ uid:“-L3HQjgyXe6iNC0r0Ftr”
------ 用户名:“我的用户名”

当我检查存在的用户名时,我得到了正确的 Toast。但是,如果被检查的用户名不存在,则不会运行 Toast 下 else 语句中的代码。有什么建议吗?

btnSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final String username = txtUsername.getText().toString();
            final String password = txtPassword.getText().toString();
            final String number = txtNumber.getText().toString();
            final boolean[] createUser = new boolean[1];

            user = SerializableHelper.loadDataFromFile(OnBoardingActivity.this);

            if (user != null) {
                Log.d(TAG, "User uid: " + user.getUid());
                Log.d(TAG, "User username: " + user.getUsername());
                Toast.makeText(OnBoardingActivity.this, "You're already Registered!", Toast.LENGTH_SHORT).show();

            } else {
                Query query = mFBUsers.orderByChild("username").equalTo(username);
                query.addListenerForSingleValueEvent(new ValueEventListener() {

                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot child : dataSnapshot.getChildren()) {

                            if (child.getValue(User.class).getUsername().equals(username)) {
                                Toast.makeText(OnBoardingActivity.this, "username already exists!", Toast.LENGTH_SHORT).show();

                            } else {
                                Log.d(TAG, "TELL APP TO CREATE NEW USER");
                                String tempUid = mFBUsers.push().getKey();
                                user = new User(tempUid, username, password, number);

                                // save user data locally before pushing to Firebase
                                SerializableHelper.saveSerializable(OnBoardingActivity.this, user);
                                mFBUsers.child(tempUid).setValue(user);
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
            }
        }
    });

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您的代码中一个非常明显的问题是您在 ValueEventListeneronDataChange 方法中更新了 createUser[0],但您在它之外使用它。

    请注意ValueEventListener 是异步执行的。因此它将继续执行剩余的代码,而无需等待调用onDataChange

    所以如果你想等待createUser[0]的更新值,你应该从onDataChange内部调用整个if代码块

    希望这会有所帮助。如果您希望我进一步详细说明,请告诉我。

    【讨论】:

    • 您看,在提交此请求之前,我在 onDataChange 代码块中按照您的建议在正确的位置设置了正确的逻辑。出于某种奇怪的原因,它只是没有被执行...我更新了问题中的代码以将代码反映在正确的位置。
    【解决方案2】:

    好的,我知道我的问题代码是什么

                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
    
                            for (DataSnapshot child : dataSnapshot.getChildren()) {
    
                                if (child.getValue(User.class).getUsername().equals(username)) {
                                    Toast.makeText(OnBoardingActivity.this, "username already exists!", Toast.LENGTH_SHORT).show();
                                    return;
                                }
                            }
    
                            Log.d(TAG, "TELL APP TO CREATE NEW USER");
                            String tempUid = mFBUsers.push().getKey();
                            user = new User(tempUid, username, password, number);
    
                            // save user data locally before pushing to Firebase
                            SerializableHelper.saveDataToFile(OnBoardingActivity.this, user);
                            mFBUsers.child(tempUid).setValue(user);
                        }
    

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多