我有一个名为CourseDetails
的活动和模型。
String getData;
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business");
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
CourseDetails c = dataSnapshot.getValue(CourseDetails.class);
getData = c.getCourseName();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
textview1.setText(getData);
使用上面的代码会在上面的最后一行抛出NullPointerException
。但是,如果我将textview1.setText(getData)
放入ValueEventListener
getData = c.getCourseName()
下,则可以正确显示数据。
我发现工作的方法是使用SharedPreferences
或设置public void display(String data) { textview1.setText(data); }
等方法的数据。但即使数据在ValueEventListener
之外,还有哪些其他方法可以保留检索到的数据?
例如,我想将添加的数据保存到ArrayList
。
ArrayList<String> listData;
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business");
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
CourseDetails c = dataSnapshot.getValue(CourseDetails.class);
String code = c.getCourseCode();
String name = c.getCourseName();
String CodeName = code + " " + name;
listData.add(CodeName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
// data in ArrayList should be able to display here
StringBuilder builder = new StringBuilder();
for (String s : listData) {
builder.append(s + "\n");
}
textview1.setText(builder.toString());
如何实现这种持久性?
答案 0 :(得分:3)
根据我的理解,当这些特定数据被修改时,Firebase将通知附加到特定引用(添加addValueEventListener
的数据库引用)的所有数据侦听器。那是什么时候
当这些数据库引用中的数据被修改时,将调用onDataChange
,
(除了修改之外,这个方法总是第一次被调用)。
这就发生了
异步,所以在第一种情况下出现null因为我们不知道数据是否从Firebase和
据我所知,Android的主要线程无法暂停或暂停,直到我们检索数据为什么我们在Android中使用异步任务。
因此,我认为对数据更改进行特定更新或任务的最佳方法是onDataChange
方法。所以,就像你说的那样
通过在onDataChange
内进行更改或通过从onDataChange调用其他方法来完成。
或者,如果您正在使用
然后,适配器通知适配器onDataChange
内的更改。此外,你可以看看其他选择,即FirebaseRecyclerAdapter
,然后,
它将自动处理更新,无需任何额外的努力。