DataSnapshot数据在android中显示为null

时间:2017-05-03 14:55:53

标签: android firebase firebase-realtime-database

我正在尝试从firebase数据库读取数据,但每次DataSnapshot都给出Null值,我能够更新数据但无法读取数据。

任何人都可以帮助我

private void showData(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()){
        UserInformation uInfo = new UserInformation();
        uInfo.setName(ds.child(userID).getValue(UserInformation.class).getName()); //set the name
        uInfo.setEmail(ds.child(userID).getValue(UserInformation.class).getEmail()); //set the email
        uInfo.setPhone_num(ds.child(userID).getValue(UserInformation.class).getPhone_num()); //set the phone_num

        //display all the information
        Log.d(TAG, "showData: name: " + uInfo.getName());
        Log.d(TAG, "showData: email: " + uInfo.getEmail());
        Log.d(TAG, "showData: phone_num: " + uInfo.getPhone_num());
        Toast.makeText(this,uInfo.getName().toString(),Toast.LENGTH_SHORT).show();

        ArrayList<String> array  = new ArrayList<>();
        array.add(uInfo.getName());
        array.add(uInfo.getEmail());
        array.add(uInfo.getPhone_num());
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
        mListView.setAdapter(adapter);
    }
}

我从

调用此函数
 myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
            try {
                showData(dataSnapshot);
            }catch (Exception e)
            {
                toastMessage("datasnapshow Exception"+e);

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

这会给我Null Exception。我坚持这个问题任何人都可以帮助我。数据库结构:

{
    myfirebase284
        m0p7r9ryj5Mr22NVWUt1DcYTjqG2
            email: "pema@gmail.com"
            name: "pema"
            phone_num: 9990480514
}

enter image description here

1 个答案:

答案 0 :(得分:0)

如果要显示数据,则无需创建UserInformation类的新对象。您需要从UserInformation对象获取dataSnapshot个对象。因此,为了实现这一点,请进行以下更改。改变这一行:

UserInformation uInfo = new UserInformation();

UserInformation uInfo = dataSnapshot.getValue(UserInformation.class);
String name = uInfo.getName();
String email = uInfo.getEmail();
String phone_num = uInfo.getPhone_num();

考虑到getName()getEmail()getPhone_num()是模型类中的公共getter。

也从for循环中取出ArrayList<String> array = new ArrayList<>();

根据您使用String类读取数据的数据库结构,请使用以下代码:

DatabaseReference yourRef = FirebaseDatabase.getInstance().getReference().child(userId);
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String email = (String) dataSnapshot.child("email").getValue();
        String name = (String) dataSnapshot.child("name").getValue();
        String phone_num = (String) dataSnapshot.child("phone_num").getValue();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
yourRef.addListenerForSingleValueEvent(eventListener);

其中userIdpush()方法生成的唯一ID。

如果您想了解有关阅读和写入Firebase数据库的更多信息,请查看官方doc

希望它有所帮助。