Android - 保存从 Firebase 检索到的数据
Android - Persist data retrieved from Firebase
我有一个 activity 和一个名为 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());
如何做到这样的坚持?
根据我的理解,当这些特定数据被修改时,Firebase 将通知所有附加到特定引用的数据侦听器(添加 addValueEventListener
的数据库引用)。那就是当
onDataChange
将被调用,当这些数据库引用中的数据发生修改时,
(除了修改之外,该方法总是会在第一次被调用)。
这就发生了
异步的,所以在第一种情况下出现 null 因为我们不知道数据是否从 Firebase 中检索并且
据我所知,Android 的主线程在我们检索数据之前不能暂停或暂停,这就是我们在 Android 中使用异步任务的原因。
所以,我认为对数据更改进行特定更新或任务的最佳方法是在 onDataChange
方法内。所以,就像你说的那样
通过在 onDataChange
本身内进行这些更改或通过从 onDataChange 调用一些其他方法来完成。
或者,如果您正在使用
然后,适配器通知适配器有关 onDataChange
内的更改。另外,您可以看看其他选择,即 FirebaseRecyclerAdapter
然后,
它将自动处理更新,无需任何额外努力。
我有一个 activity 和一个名为 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());
如何做到这样的坚持?
根据我的理解,当这些特定数据被修改时,Firebase 将通知所有附加到特定引用的数据侦听器(添加 addValueEventListener
的数据库引用)。那就是当
onDataChange
将被调用,当这些数据库引用中的数据发生修改时,
(除了修改之外,该方法总是会在第一次被调用)。
这就发生了
异步的,所以在第一种情况下出现 null 因为我们不知道数据是否从 Firebase 中检索并且
据我所知,Android 的主线程在我们检索数据之前不能暂停或暂停,这就是我们在 Android 中使用异步任务的原因。
所以,我认为对数据更改进行特定更新或任务的最佳方法是在 onDataChange
方法内。所以,就像你说的那样
通过在 onDataChange
本身内进行这些更改或通过从 onDataChange 调用一些其他方法来完成。
或者,如果您正在使用
然后,适配器通知适配器有关 onDataChange
内的更改。另外,您可以看看其他选择,即 FirebaseRecyclerAdapter
然后,
它将自动处理更新,无需任何额外努力。