如何使用Firebase保存用户信息,用户在android中输入唯一ID?

时间:2017-05-25 10:30:06

标签: android firebase firebase-realtime-database

我正在使用FireBase实现一个应用程序,在这个应用程序中我必须通过用户输入唯一ID来保存用户信息。我怎样才能做到这一点。实际上它使用随机生成的值保存数据。但我想添加一个用户输入唯一ID。

   @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    txtDetails = (TextView) findViewById(R.id.txt_user);
    inputName = (EditText) findViewById(R.id.name);
    inputEmail = (EditText) findViewById(R.id.email);
    btnSave = (Button) findViewById(R.id.btn_save);

    mFirebaseInstance = FirebaseDatabase.getInstance();

    // get reference to 'users' node
    mFirebaseDatabase = mFirebaseInstance.getReference("users");

    // store app title to 'app_title' node
    mFirebaseInstance.getReference("app_title").setValue("Realtime Database");

    // app_title change listener
    mFirebaseInstance.getReference("app_title").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.e(TAG, "App title updated");



            // update toolbar title

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.e(TAG, "Failed to read app title value.", error.toException());
        }
    });

    // Save / update the user
    btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String name = inputName.getText().toString();
            String email = inputEmail.getText().toString();

            // Check for already existed userId
            if (TextUtils.isEmpty(userId)) {
                createUser(name, email);
            } else {
                createUser(name, email);
            }

        }
    });

    toggleButton();
}

// Changing button text
private void toggleButton() {
    if (TextUtils.isEmpty(userId)) {
        btnSave.setText("Save");
    } else {
        btnSave.setText("Save");
    }
}

/**
 * Creating new user node under 'users'
 */
private void createUser(String name, String email) {
    // TODO
    // In real apps this userId should be fetched
    // by implementing firebase auth
    if (TextUtils.isEmpty(userId)) {
        userId = mFirebaseDatabase.push().getKey();
    }

    User user = new User(name, email);

    mFirebaseDatabase.child(userId).push().setValue(user);

    addUserChangeListener();
}

/**
 * User data change listener
 */
private void addUserChangeListener() {
    // User data change listener
    mFirebaseDatabase.child(userId).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);

            // Check for null
            if (user == null) {
                Log.e(TAG, "User data is null!");
                return;
            }

            Log.e(TAG, "User data is changed!" + user.name + ", " + user.email);

            // Display newly updated name and email
            //     txtDetails.setText(user.name + ", " + user.email);

            // clear edit text
            inputEmail.setText("");
            inputName.setText("");

            toggleButton();
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.e(TAG, "Failed to read user", error.toException());
        }
    });
}

private void updateUser(String name, String email) {
    // updating the user via child nodes
    if (!TextUtils.isEmpty(name))
        mFirebaseDatabase.child(userId).child("name").setValue(name);

    if (!TextUtils.isEmpty(email))
        mFirebaseDatabase.child(userId).child("email").setValue(email);
}    

1 个答案:

答案 0 :(得分:0)

要以唯一标识符保存用户数据,我建议您使用email address代替of pushing a new key或使用uid。电子邮件地址独特且易于使用。但由于Firebase不接受密钥中的.符号,我建议您对电子邮件地址进行编码,如下所示:

  

name@email.com - >名@电子邮件,玉米

如您所见,我已使用逗号.更改了点符号,。为了实现这一点,我使用这种方法重新启动你:

static String encodeUserEmail(String userEmail) {
    return userEmail.replace(".", ",");
}

static String decodeUserEmail(String userEmail) {
    return userEmail.replace(",", ".");
}

希望它有所帮助。