Как правильно хранить данные в базе данных реального времени под аутентифицированным ключом пользователя? - PullRequest
0 голосов
/ 24 октября 2019

Я сохранил некоторые данные в базе данных в реальном времени под аутентифицированным ключом, используя общие настройки. Я использовал 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 ]

1 голос
/ 24 октября 2019

Вы получаете этот нежелательный дополнительный уровень (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 и запишите их в базу данных. Таким образом, у вас будет дерево базы данных без этого дополнительного узла.

0 голосов
/ 31 октября 2019

Перенес ответ на этот пост, потому что второй был закрыт как дубликат -

Чтобы получить то, что вы ищете, вам нужно будет перебрать список ваших данных и установить его. за раз в качестве значения под 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);
}
...