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 AB中的数据

以上是关于Android - 持久化从 Firebase 检索到的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?

检索子值 -firebase-

如何在firebase中检索子(自动增量)名称

如何在 Android 上的 Firebase 存储中设置持久性?

Android 中的 Firebase 数据库持久性错误

Unity 中的 Firebase - 禁用持久性