Android - 持久化从 Firebase 检索到的数据
Posted
技术标签:
【中文标题】Android - 持久化从 Firebase 检索到的数据【英文标题】:Android - Persist data retrieved from Firebase 【发布时间】:2016-08-12 20:41:33 【问题描述】:我有一个名为 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());
如何实现这种持久化?
【问题讨论】:
【参考方案1】:据我了解,当特定数据被修改时,Firebase 将通知所有附加到特定引用(添加 addValueEventListener
的数据库引用)的所有数据侦听器。那是什么时候
onDataChange
将被调用,当这些数据库引用处的数据发生修改时,
(除了修改该方法将始终被第一次调用)。
这会发生
异步的,所以在第一种情况下发生 null 因为我们不知道数据是否从 Firebase 中检索出来,并且
据我所知,在我们检索数据之前,android 的主线程不能暂停或暂停,这就是我们在 Android 中使用异步任务的原因。
所以,我认为对数据更改进行特定更新或任务的最佳方法是在onDataChange
方法内。所以,就像你说的那样
通过在onDataChange
本身内进行这些更改或从 onDataChange 调用其他方法来完成。
或者,如果您正在使用
然后适配器,通知适配器onDataChange
内的变化。另外,您可以看看其他选择,即FirebaseRecyclerAdapter
然后,
它将自动处理更新,无需任何额外的努力。
【讨论】:
您好,openSource。谢谢。如果是这样,如果我想从一个节点检索数据并将其保存到ArrayList A
,并从另一个节点检索数据并保存到ArrayList B
,您能否建议如何在EventListener
之后将数据保留在ArrayLists
中被删除了?
ArrayLists
中的数据将用于稍后比较
你好,我不是很明白,是不是EventListener
被删除后是指你不想ArrayLists
每次修改数据都更新?
是的。在我的代码中实际上是 addListenerForSingleValueEvent
从 Firebase 检索数据。我更正了上面的代码
我的目标是使用 ArrayLists
比较从 Firebase 检索到的数据。就像首先从节点 A 检索数据并添加到 ArrayList A
,然后删除 ValueEventListener
;然后从节点 B 检索数据并添加到 ArrayList B
,然后删除 ValueEventListener
。最后只比较ArrayList A
和B
中的数据以上是关于Android - 持久化从 Firebase 检索到的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?