Как узнать, есть ли какие-либо извлеченные данные в Firebase? - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь выяснить, есть ли способ узнать, есть ли извлеченные данные в базе данных Firebase в реальном времени.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ARRAY
    accountList = new ArrayList<>();
    // Assigning Object to Controls (bullshit)
    textboxUser = (TextView) findViewById(R.id.textBoxUsername);
    textboxPass = (TextView) findViewById(R.id.textBoxPassword);
    buttonEnter = (Button) findViewById(R.id.buttonEnter);

    postRef = FirebaseDatabase.getInstance().getReference("account");
    dataRefaccount = FirebaseDatabase.getInstance().getReference("account");


    // OnClick Method Button
    buttonEnter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                username = textboxUser.getText().toString();
                Query query = FirebaseDatabase.getInstance().getReference("account").orderByChild("username").equalTo(username);
                query.addListenerForSingleValueEvent(valueEventListener);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Toast.makeText(getApplicationContext(), getted, Toast.LENGTH_LONG).show();
            }



        }
    });
}

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        for (DataSnapshot data : dataSnapshot.getChildren()) {
            if (data.child(username).exists()) {
                getted = "yes";
            } else {
                getted = "No";
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
    }
};

Получатель всегда "НЕТ".

Ответы [ 4 ]

0 голосов
/ 12 июня 2019

Когда вы пытаетесь использовать следующую строку кода:

Toast.makeText(getApplicationContext(), getted, Toast.LENGTH_LONG).show();

Значение getted всегда будет содержать значение No, поскольку к тому времени, когда вы пытаетесь передать это сообщение, данные еще не закончили загрузку из базы данных. Это происходит из-за асинхронного поведения метода onDataChange(). Обратите внимание, что нет никаких гарантий относительно того, сколько времени это займет, это может занять от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные станут доступны.

Быстрое решение этой проблемы - использование всей логики, связанной с переменной getted, только внутри или вызываемой из onDataChange() метода.

Если вам нужно использовать его вне функции обратного вызова, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью Пользовательский обратный звонок. Вы также можете взглянуть на это видео для лучшего понимания.

0 голосов
/ 12 июня 2019

Единственный метод, который разрешен сообществом firebase для получения данных: Вы должны попробовать следующий код, как для извлеченного имени пользователя:

DatabaseReference bDatabaseRef;
bDatabaseRef=FirebaseDatabase.getInstance().getReference().child("Users");           bDatabaseRef.addValueEventListener(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapshot) {
           if(dataSnapshot.exists() && dataSnapshot.getChildrenCount()>0){
               Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();

               if(map.get("Username")!=null){

                   String User_name =map.get("Username").toString();

               }



           }
       }
       @Override
       public void onCancelled(DatabaseError databaseError) {
       }
       });
0 голосов
/ 12 июня 2019

Вы должны попробовать это.Сначала убедитесь, что вы не получаете никакой ошибки в ответе на запрос.

Query query = FirebaseDatabase.getInstance().getReference().child("account").orderByChild("username").equalTo(username);

ValueEventListener valueEventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.getValue() != null && dataSnapshot.getChildrenCount() > 0) {
           for (DataSnapshot data : dataSnapshot.getChildren()) {

                // I'm sure you are looking for below line.. Go and try this.
                if (data.child("username").getValue().toString().equal(username) ) {
                  getted = "yes";
                  break;
                } else {
                  getted = "No";
                }
           }
        } else {
            getted = No value available;
        }
        Toast.makeText(getApplicationContext(), "getted : " + getted, Toast.LENGTH_LONG).show();
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show(); 
    } 
};

FYI: вызовы Firebase - это асинхронный вызов, поэтому предложение finally для нажатия кнопки всегда будет выполняться до ответа от базы данных firebase.Поэтому попробуйте удалить оттуда try-catch и используйте приведенный выше код для вывода значения getted .

0 голосов
/ 12 июня 2019

Вы можете проверить, существует ли DataSnapshot, вызвав следующее:

Query query = FirebaseDatabase.getInstance().getReference().child("account").orderByChild("username").equalTo(username);

ValueEventListener valueEventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()) {
            getted = yes;
        }else{
            getted = no;
        }
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show(); 
    } 
};

Предоставив структуру вашей базы данных, будет проще дать ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...