Android:用户名的Firebase数据库查询,如果用户名不存在,则创建新用户记录

时间:2018-01-22 07:27:35

标签: android firebase firebase-realtime-database

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

数据库结构

- users
--- -L3HQjgyXe6iNC0r0Ftr
------ mobile: "+15553334444"
------ password: "yoyo"
------ uid: "-L3HQjgyXe6iNC0r0Ftr"
------ username: "myusername"

当我检查存在的用户名时,我会得到正确的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) {
                    }
                });
            }
        }
    });

2 个答案:

答案 0 :(得分:0)

您的代码中一个明显的问题是您正在更新createUser[0] onDataChange ValueEventListener方法,但您正在其外部使用它。

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

因此,如果您要等待createUser[0]的更新值,则应从if

内调用整个onDataChange代码块

希望这会有所帮助。如果您想让我进一步阐述,请告诉我。

答案 1 :(得分:0)

好的,我弄清楚我的问题代码是什么

import numpy as np

mesh = np.array([[ np.array([[ (np.array([[ 6, 6]], dtype=float), 
     np.array([[-131.659809],
      [-131.659809],
      [-131.659809], 
      [  52.022239],
      [  52.022239],
      [  52.022239]]), 
     np.array([[ 189.358345],
      [ 187.271049],
      [ 185.183753],
      [ -29.807736],
      [ -31.895032],
      [ -33.982328]]))]],
     dtype=[('dim', 'O'), ('x', 'O'), ('y', 'O')])]], dtype=object)