我正在尝试从用户帐户中读取数据列表,如下所示:
但是没有调用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时遇到了很多麻烦,因此感谢您的帮助。干杯!
编辑: 其他一些具有相同结果的代码:
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());
}
};
}
答案 0 :(得分:2)
您什么也得不到,因为您没有循环将子级放入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!
}
};
如果仍然无法启动,请检查日志,以查看databaseError.getMessage()
返回。
答案 1 :(得分:0)
感谢Alex Mamo
的回答here。完美解释。