Android & Firebase сравнивая EditText с дочерним значением базы данных в реальном времени - PullRequest
0 голосов
/ 09 января 2020

Этот вопрос задавался по адресу: Сравнение строки EditText с дочерним значением базы данных firebase , и я использую это как руководство, но сталкиваюсь с проблемами, которые там не были решены. Я знаю, что Firebase предлагает варианты аутентификации, но мне нужно использовать реальное время. Я хочу сравнить 2 значения, введенные в моем имени пользователя и пароле EditTexts, с дочерними значениями в моей базе данных в реальном времени «Пользователи».

Когда я запускаю свой код, я получаю

Попытка вызвать виртуальный метод 'java .lang.String java .lang .Object.toString () 'для ссылки на пустой объект

Я предполагаю, что либо / и username1, и / или password1 имеют значение null, и поэтому мой код не запускается.

logUsername = findViewById(R.id.etLoginUsers);
logPassword = findViewById(R.id.etLoginPassword);

FirebaseApp.initializeApp(this);
final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                final String username = logUsername.getText().toString().trim();
                final String password = logPassword.getText().toString().trim();
                mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        String username1 = dataSnapshot.child("username").getValue().toString();
                        String password1 = dataSnapshot.child("password").getValue().toString();

                        if (username.equals(username1) & password.equals(password1)){
                            Intent intSignIn = new Intent(MainActivity.this, HomeActivity.class);
                            startActivity(intSignIn);
                        } else {
                            Toast.makeText(MainActivity.this, "Incorrect Login Details", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

. Мои правила чтения и записи установлены в true. Я новичок в кодировании, поэтому любая помощь будет принята с благодарностью. Большое спасибо!

1 Ответ

0 голосов
/ 09 января 2020

Ключ в этом фрагменте кода:

final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");
mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String username1 = dataSnapshot.child("username").getValue().toString();
        String password1 = dataSnapshot.child("password").getValue().toString();

Поскольку вы загружаете из /Users, dataSnapshot содержит данные для всех пользователей. Каждый пользователь username и password находится в дочернем узле под dataSnapshot, который должен обрабатывать ваш код.

Самый простой способ сделать это из текущего кода:

final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");
mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
            String username1 = userSnapshot.child("username").getValue(String.class);
            String password1 = dataSnapshot.child("password").getValue(String.class);
        }

Здесь имеются большие различия:

  • I l oop над дочерними узлами снимка данных, чтобы получить снимок для каждого отдельного пользователя.
  • Я использую getValue(String.class), который будет возвращать значение, только если существует username.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...