簡體   English   中英

如何在用戶認證密鑰下正確地將數據存儲在實時數據庫中?

[英]How to store data in realtime database properly under user authenticated key?

我已經使用共享首選項在經過驗證的密鑰下將一些數據存儲在實時數據庫中。 我使用SharedPreferences是因為我使用多個頁面來獲取用戶數據。 在存儲數據時,它得到了一個額外的節點,即“所有”節點,我沒有在我的代碼中的任何地方添加這個節點。 節點應該像 (1) User->authkey->age 而不是 (2) User->authkey->all->age。 由於這個額外的節點,我無法檢索數據 firebase。 我應該怎么做才能使它像(1)一樣。

以下是數據庫的片段。

這些是用戶數

這是所有節點下的數據

下面是我將數據存儲到我的數據庫中的代碼

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);
            }
        });
    }

}

`

您在數據庫中獲得了不需要的額外級別( all ),因為當您使用以下方式寫入數據時:

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

您正在將SharedPreferences object 傳遞給setValue()方法:

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

不是存儲在 object 中的數據。 在您的sp object 中,數據存儲為包含鍵和值對的Map object 中的第一個鍵是all ,值是您的實際數據。 這就是你有這種結構的原因。 要解決這個問題,只需從您的sp object 中取出數據,將其保存到Users object 並將其寫入數據庫。 這樣,您將擁有一個沒有該額外節點的數據庫樹。

將答案移至此帖子,因為第二個已作為副本關閉-

為了獲得您要查找的內容,您需要迭代您擁有的詳細信息列表,並一次設置一個作為用戶 UID 下的值,或者只需使用您需要的所有參數創建一個 object 並發送object

以 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM