Я пытаюсь прочитать список данных из учетной записи пользователя, который выглядит следующим образом:
![db](https://imgur.com/9HDixEd.jpg)
Но слушатель 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());
}
};
}