![](/img/trans.png)
[英]Setting variable inside onDataChange in Firebase (singleValue Listener)
[英]Firebase onDataChange - Value Event Listener not listening for changes
我正在嘗試從用戶帳戶中讀取數據列表,如下所示:
但是沒有調用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());
}
};
}
您無法獲得任何東西,因為您沒有循環獲取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()
返回。
感謝Alex Mamo
在這里的回答。 完美的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.