【问题标题】:Update data by matching a Parent node - Firebase Database通过匹配父节点更新数据 - Firebase 数据库
【发布时间】:2017-12-13 01:13:14
【问题描述】:

我想更新我的密码值,我将输入用户名并搜索与用户名文本匹配的父节点以更改密码。 这是我的代码

db = FirebaseDatabase.getInstance().getReference();

    logIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressDialog.setMessage("Changing Password");
            newPassword();
            progressDialog.dismiss();
            Toast.makeText(getApplicationContext(), "Change successful.", Toast.LENGTH_LONG).show();
        }
    });//inside of onCreate method


private void newPassword(){

    if(TextUtils.isEmpty(userText.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input username.", Toast.LENGTH_LONG).show();
        return;
    }
    if(TextUtils.isEmpty(emailText.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input email.", Toast.LENGTH_LONG).show();
        return;
    }
    if(TextUtils.isEmpty(contactText.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input contact no.", Toast.LENGTH_LONG).show();
        return;
    }
    if(TextUtils.isEmpty(firstText.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input first name.", Toast.LENGTH_LONG).show();
        return;
    }
    if(TextUtils.isEmpty(lastText.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input last name.", Toast.LENGTH_LONG).show();
        return;
    }
    if(TextUtils.isEmpty(password.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input password.", Toast.LENGTH_LONG).show();
        return;
    }
    if(TextUtils.isEmpty(retype.getText().toString().trim())){
        progressDialog.dismiss();
        Toast.makeText(this, "Input retype password.", Toast.LENGTH_LONG).show();
        return;
    }

    db.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String username = userText.getText().toString().trim();
            for(DataSnapshot ds: dataSnapshot.getChildren()){
                if(username.matches(ds.getKey())){
                    user.setPassword(password.getText().toString().trim());
                    ds.getRef().child(username).child("password").setValue(user.getPassword());
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d("User", databaseError.getMessage());
        }
    });

}

我的问题是如何到达要更改其值的节点,并且每次按下按钮时,密码的值都不会改变。

感谢您的帮助。

已编辑

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

    ...

    progressDialog = new ProgressDialog(this);
    db = FirebaseDatabase.getInstance().getReference();

    db.child("users").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            username = (String)dataSnapshot.child(userText.getText().toString().trim()).child("username").getValue();
            address = (String)dataSnapshot.child(userText.getText().toString().trim()).child("address").getValue();
            contact = (String)dataSnapshot.child(userText.getText().toString().trim()).child("contact").getValue();
            email = (String)dataSnapshot.child(userText.getText().toString().trim()).child("email").getValue();
            first = (String)dataSnapshot.child(userText.getText().toString().trim()).child("first").getValue();
            last = (String)dataSnapshot.child(userText.getText().toString().trim()).child("last").getValue();
            pass = passwordText.getText().toString().trim();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(ForgotPassword.this, "Database Error", Toast.LENGTH_LONG).show();
            Intent i = new Intent(ForgotPassword.this, SignIn.class);
            startActivity(i);
        }
    });

    logIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            newPassword();
        }
    });

    cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(ForgotPassword.this, SignIn.class);
            startActivity(i);
        }
    });
}

private void newPassword(){

    ...
    user = new User(first, last, email, contact, pass, username, address);
    db.child("users").child(username).setValue(user);
    Toast.makeText(getApplicationContext(), "Change successful.", Toast.LENGTH_LONG).show();
    Intent i = new Intent(this, TabMenu.class);
    startActivity(i);
}

每次我开始这个活动时,它都会立即在onCancelled(DatabaseError){Toast.makeText(..., "Database Error", ...).show();}上给出错误

【问题讨论】:

  • 所有文本输入都让人很难看出问题所在。你能用username 的硬编码值重现问题吗?
  • 乍一看这看起来很可疑:` if(username.matches(ds.getKey())){. Did you mean to use username.equals(ds.getKey)`?
  • 那些 if-else 语句只检查 EditText 是否有值,在将 .matches 更改为 .equals 后,程序将停止。
  • 经过一些调试,程序不会停止但密码不会改变
  • 在这种情况下,请使用硬编码值重现问题并更新问题中的代码。这将使提供帮助变得更加容易,进而改善我们能够提供帮助的变革。

标签: android json firebase-realtime-database


【解决方案1】:

如果你想在Java中比较两个字符串,你需要使用equals方法而不是matches

matches 方法判断这个字符串是否匹配给定的正则表达式。

调用这种形式为 str.matches(regex) 的方法会产生与表达式完全相同的结果

java.util.regex.Pattern.matches(regex, str).

所以改变这行代码:

username.matches(ds.getKey())

username.equals(ds.getKey())

要更改密码,你只需要直接在引用上使用setValue()方法,如下所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("users").child("brian").child("password").setValue("newPassword");

【讨论】:

  • 仍然,不,程序最终会停止。
  • 经过一些调试,程序不会停止但密码不会改变
  • 还是不行。我为我的数据库设置的规则是默认的,但是 auth == null,所以我没有做一些身份验证。我正在分享这个,也许它会有所帮助。
  • 我在 onCreate() 上添加了 .addValueEventListener。在向数据库添加值之前,覆盖 onCancelled(DatabaseError) 会给我我为错误设置的消息。我没有把 db.child("users").("brian").setValues("values");我把它放在按钮的监听器中。
  • 您不需要监听器即可更改 Firebase 数据库中的值。您只需要直接在引用上使用 setValue() 即可。正确的做法是这样的:db.child("users").("brian").child("password").setValues("values");
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
相关资源
最近更新 更多