簡體   English   中英

Firebase onDataChange-值事件監聽器未監聽更改

[英]Firebase onDataChange - Value Event Listener not listening for changes

我正在嘗試從用戶帳戶中讀取數據列表,如下所示: D b

但是沒有調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM