Android - 从Firebase检索的持久数据

时间:2016-08-12 20:41:33

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

我有一个名为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 个答案:

答案 0 :(得分:3)

根据我的理解,当这些特定数据被修改时,Firebase将通知附加到特定引用(添加addValueEventListener的数据库引用)的所有数据侦听器。那是什么时候 当这些数据库引用中的数据被修改时,将调用onDataChange, (除了修改之外,这个方法总是第一次被调用)。

这就发生了 异步,所以在第一种情况下出现null因为我们不知道数据是否从Firebase和 据我所知,Android的主要线程无法暂停或暂停,直到我们检索数据为什么我们在Android中使用异步任务。 因此,我认为对数据更改进行特定更新或任务的最佳方法是onDataChange方法。所以,就像你说的那样 通过在onDataChange内进行更改或通过从onDataChange调用其他方法来完成。

或者,如果您正在使用 然后,适配器通知适配器onDataChange内的更改。此外,你可以看看其他选择,即FirebaseRecyclerAdapter,然后, 它将自动处理更新,无需任何额外的努力。