如何在用户验证密钥下将数据正确存储在实时数据库中?

时间:2019-10-24 09:33:21

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

我已经使用共享首选项在固定密钥下将一些数据存储在实时数据库中。我使用SharedPreferences是因为我使用了多个页面来获取用户数据。在存储数据时,它得到一个额外的节点,即“所有”节点,而我没有在代码中的任何地方添加此节点。该节点应该像(1)User-> authkey-> age那样流动,而不像(2)User-> authkey-> all-> age那样流动。由于有这个额外的节点,因此我无法检索数据火力地堡。 我应该怎么做才能使其像(1)。

下面是数据库的片段。

These are the number of users

This is the data under all node

下面是我的代码,用于将数据存储到数据库中

public class LoginDetails extends AppCompatActivity {
    EditText etemail_id,etpassword;
    TextView tvlogin_details;
    Button btregister,btback;
    FirebaseAuth mAuth;
    FirebaseDatabase database;
    DatabaseReference reference;
    Users users;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_details);
        etemail_id = (EditText) findViewById(R.id.etEmailid);
        etpassword = (EditText) findViewById(R.id.etPassword);

        tvlogin_details = (TextView) findViewById(R.id.tvLoginDetails);
        btback = (Button) findViewById(R.id.btBack);
        mAuth = FirebaseAuth.getInstance();
        btregister = (Button) findViewById(R.id.btRegister);
        database=FirebaseDatabase.getInstance();
        reference=database.getReference();
        users=new Users();
        btregister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String email = etemail_id.getText().toString().trim();
                final String password = etpassword.getText().toString().trim();

                if (TextUtils.isEmpty(email)) {
                    etemail_id.setError("Provide your Email first!");
                    etemail_id.requestFocus();
                }
                else if (TextUtils.isEmpty(password)) {
                    etpassword.setError("Enter Password!");
                    etpassword.requestFocus();
                }
                else if (!(email.isEmpty() && password.isEmpty())) {
                    mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(LoginDetails.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {

                                reference.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        SharedPreferences sp = getSharedPreferences("Mypref", Context.MODE_PRIVATE);
                                        reference.child("User").child(Objects.requireNonNull(mAuth.getUid())).setValue(sp);
                                        Toast.makeText(getApplicationContext(), "data entered", Toast.LENGTH_SHORT).show();
                                    }
                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                        Toast.makeText(getApplicationContext(), "database error", Toast.LENGTH_SHORT).show();
                                    }
                                });
                                Toast.makeText(LoginDetails.this, "Successfully registered", LENGTH_LONG).show();
                                Intent it = new Intent(getApplicationContext(), Login.class);
                                startActivity(it);
                            }

                            else {
                                Toast.makeText(LoginDetails.this, "Registration Error", LENGTH_LONG).show();
                            }
                        }
                    });
                }
                else {
                    Toast.makeText(LoginDetails.this, "Error", Toast.LENGTH_SHORT).show();
                }
             }
        });

        btback.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent it1 = new Intent(getApplicationContext(), Preferences.class);
                startActivity(it1);
            }
        });
    }

}

`

2 个答案:

答案 0 :(得分:1)

您正在数据库中获得不必要的额外级别(all),因为使用以下命令写入数据时:

reference.child("User").child(Objects.requireNonNull(mAuth.getUid())).setValue(sp);

您将setValue()对象传递给SharedPreferences方法:

SharedPreferences sp = getSharedPreferences("Mypref", Context.MODE_PRIVATE);

并且存储在该对象中的数据。在sp对象内部,数据存储为包含键和值对的Map。该对象中的第一个键是 all ,该值是您的实际数据。这就是您拥有该结构的原因。要解决此问题,只需从sp对象中获取数据,然后将其保存到Users对象中,然后将其写入数据库即可。这样,您将拥有一个没有该额外节点的数据库树。

答案 1 :(得分:0)

将帖子的答案移至该位置,因为第二个帖子已作为重复副本关闭-

要获得所需的内容,您需要在详细信息列表上进行迭代,并一次在用户的UID下将其设置为值,或者只需创建一个包含所有您需要的参数并发送对象

使用HashMap进行迭代的示例:

HashMap hashMap = new HashMap();

SharedPreferences sp = getSharedPreferences("Mypref", 0);
hashMap.put("first_name", sp.getString("first_name", null))
hashMap.put("last_name", sp.getString("last_name",null))
hashMap.put("fathers_name", sp.getString("fathers_name", null))
hashMap.put("date", sp.getString("date", null))
hashMap.put("income", sp.getString("income", null))
(.......)

Iterator iterator = hashMap.entrySet().iterator() 
if (hashMap.hasNext()) {
    iterator.next() 
    reference.child("User").child(Objects.requireNonNull(mAuth.getUid())).child(iterator.getKey).setValue(iterator.getValue);
}