【问题标题】:Android - Persist data retrieved from FirebaseAndroid - 持久化从 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());

如何实现这种持久化?

【问题讨论】:

    标签: android firebase firebase-realtime-database persistent-data


    【解决方案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中的数据
    猜你喜欢
    • 2018-11-07
    • 2018-03-10
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多