Android - 从Firebase检索到的持久性数据 [英] Android - Persist data retrieved from Firebase

查看:273
本文介绍了Android - 从Firebase检索到的持久性数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活动和一个名为 CourseDetails 的模型。

  String getData; 
DatabaseReference mRef = FirebaseDatabase.getInstance()。getReference()。child(courses)。child(Business);
mRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override $ b $ 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 DataEventListener(){
@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);
}
}
$ b $ @Override
public void onCancelled(DatabaseError databaseError){

}
});

// ArrayList中的数据应该可以在这里显示
StringBuilder builder = new StringBuilder();
for(String s:listData){
builder.append(s +\\\
);
}

textview1.setText(builder.toString());

如何实现这种持久性?

addValueEventListener 的地方)当那些特定的数据被修改时。这就是当
onDataChange 被调用的时候,在这些数据库引用修改数据时,
(除了修改方法总是会被调用第一次)。

这是
异步发生的情况,所以在第一种情况下,发生null是因为我们不知道数据是从Firebase中获取的,
是据我所知,Android的主线程不能暂停或暂停,直到我们检索数据,这就是为什么我们在Android中使用异步任务。
所以,我认为在数据更改上执行特定更新或任务的最好方法是在 onDataChange 方法中。所以,就像你声明的那样,通过在 onDataChange 本身进行更改,或者通过调用onDataChange中的其他方法,可以完成
。或者,如果您使用的是
适配器,那么请通知适配器关于 onDataChange 内的更改。另外,你可以看看其他的选择,例如 FirebaseRecyclerAdapter 然后
它会自动处理更新,不需要额外的努力。

I have an activity and a model called 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);

Using above code throws NullPointerException at last line above. But if I put textview1.setText(getData) into the ValueEventListener, under getData = c.getCourseName(), the data can be displayed correctly.

Methods I found working are using SharedPreferences or setting data from a method such as public void display(String data) { textview1.setText(data); }. But what are the other ways to keep the retrieved data even if the data is outside ValueEventListener?

For instance I want to persist the data added into an 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());

How to achieve this kind of persistence?

解决方案

As per my understanding, Firebase will notify all it's data listener attached to specific references (database references wherever the addValueEventListener is added) when those specific data gets modified. That is when onDataChange will be called, when there is modification of the data at those database references, (besides modification the method will always be called first time).

And this happens asynchronously, so in the first case where null occurs because we don't know whether data is retreived from Firebase and as far as I know, Android's main thread cannot be put on hold or pause until we retreive the data that's why we use Asynchronous tasks in Android. So, I think the best way to do specific updates or task on data change is within onDataChange method. So, like you stated it could be done by making those changes within onDataChange itself or by calling some other method from onDataChange.

Or, if you are using adapter then, notifying adapter about the change within onDataChange. Also, you can take a look at other choice i.e. FirebaseRecyclerAdapter then, it will handle the update automatically without any extra effort.

这篇关于Android - 从Firebase检索到的持久性数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆