Firebase onDataChange - слушатель события значения не прослушивает изменения - PullRequest
0 голосов
/ 11 января 2019

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

Но слушатель onDataChange не вызывается.

Я бы хотел получить значения «checked» и «desc»; Однако, когда я добавляю слушатель listenForSingleValueEvent, как показано ниже, onDataChange не вызывается, и я не получаю значения.

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("accounts")
            .child(uid).child("user_t").child(item_id);
//"user_t" has been shortened for this post

    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(TAG, "onDataChange: Getting single data");

            String name = (String) dataSnapshot.child("checked").getValue();
            String date = (String) dataSnapshot.child("desc").getValue();
        }
    //on Cancel etc..
    };

Даже только с:

String name = (String) dataSnapshot.child("checked").getValue();"

Внутри onDataChange он все равно не выстрелит. Из того, что я прочитал из документации Firebase, я должен использовать слушатель для чтения данных.

У меня есть похожий код в другом разделе приложения, который более или менее делает то же самое, что и приведенный выше код, и работает отлично.

В последнее время у меня было много проблем с Firebase, поэтому любая помощь приветствуется. Ура!

EDIT: Еще немного кода с таким же результатом:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("accounts").child(uid);
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.i(TAG, "onDataChange: ");
        String name = dataSnapshot.child("name").getValue().toString();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

РЕДАКТИРОВАТЬ 2: Я могу создать ключ и установить для него значение в разделе учетной записи и разделе элементов, но он вызовет функцию onDataChange. Мне удалось обойти эту проблему; однако, слушатель тогда вызывается, как только его вызывающий класс был деконструирован, и NullPointerException бросается, потому что переменные уровня класса больше не существуют.

РЕДАКТИРОВАТЬ 3 - Весь класс:

Это другой класс, но у меня точно такая же проблема.

public class StartActivity extends AppCompatActivity {

//firebase variables
private FirebaseAuth mAuth;
private FirebaseUser currentUser;
private FirebaseDatabase database;
private DatabaseReference userReference;
private String uid;
private String accountType;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    //set splash theme
    setTheme(R.style.SplashStyle);
    super.onCreate(savedInstanceState);

    //get an authentication instance
    mAuth = FirebaseAuth.getInstance();
    //get user database
    database = FirebaseDatabase.getInstance();
    userReference = database.getReference(ACCOUNTS);


    //get the user and check if logged in
    currentUser = mAuth.getCurrentUser();
    if (currentUser != null){
        uid = currentUser.getUid();
        getAccountType();

        //open the dashboard
        openDashboard();
    }else{
        openLogin();
    }

    finish();
}

private void openDashboard() {
    Intent dashboard = new Intent(this,Dashboard.class);

    dashboard.putExtra(String_Values.ACCOUNT_TYPE,accountType);
    dashboard.putExtra(String_Values.ACCOUNT_UID,uid);

    startActivity(dashboard);
    finish();

}

private void openLogin(){
    Intent loginIntent = new Intent(this,Login.class);
    startActivity(loginIntent);
}


private void getAccountType(){
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = database.getReference(ACCOUNTS).child(uid);
    Log.i(String_Values.TAG, "uid: " + uid);
    databaseReference.addListenerForSingleValueEvent(get_account_listener);
}

ValueEventListener get_account_listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        accountType = dataSnapshot.child(TYPE).getValue().toString();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.i(String_Values.TAG, "onCancelled: " + databaseError.getMessage());
    }
};

}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Спасибо Alex Mamo за ответ здесь . Прекрасно объяснил.

0 голосов
/ 11 января 2019

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

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("accounts")
        .child(uid).child("user_t");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("checked").getValue(String.class);
            String date = ds.child("desc").getValue(String.class);
        }

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};

Если он все еще не срабатывает, проверьте logcat, чтобы увидеть, что databaseError.getMessage() возвращает.

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