Firebase onDataChange - 值事件侦听器不侦听更改

利亚姆

我正在尝试从用户帐户中读取数据列表,如下所示: 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());
    }
};

}
利亚姆

感谢Alex Mamo在这里的回答完美解释。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章