Android 如何在应用程序中存储FirebaseUi创建的帖子?

Android 如何在应用程序中存储FirebaseUi创建的帖子?,android,firebase-realtime-database,firebaseui,Android,Firebase Realtime Database,Firebaseui,我有一个从Firebase检索数据的活动,并创建了一个post。但如果从最近的应用程序中删除或停止,它必须重新加载。我想将其永久存储在应用程序中。我该怎么做 我的活动: public class MainActivity extends AppCompatActivity { private RecyclerView mbloglist; private DatabaseReference mdatabase; public static final Strin

我有一个从Firebase检索数据的活动,并创建了一个post。但如果从最近的应用程序中删除或停止,它必须重新加载。我想将其永久存储在应用程序中。我该怎么做

我的活动:

public class MainActivity extends AppCompatActivity {


    private   RecyclerView mbloglist;
    private DatabaseReference mdatabase;

    public static final String TAG = "Homeactivity";
    private Context mcontext = MainActivity.this;
    private static final int ACTIVITY_NUM = 0;

    Dialog mycustomDialog;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate: starting");


        mdatabase = FirebaseDatabase.getInstance().getReference().child("Global");
        mdatabase.keepSynced(true);

        mbloglist = (RecyclerView)findViewById(R.id.recycleView_post);
        mbloglist.setHasFixedSize(true);
        mbloglist.setLayoutManager(new LinearLayoutManager(this));

        setupBottomNavigationView();
        setupToolbar();
        mycustomDialog = new Dialog(this);



    }

    @Override
    protected void onStart() {
        super.onStart();
        final ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar_post);

        progressBar.setVisibility(View.VISIBLE);
        FirebaseRecyclerAdapter<Blog,BlogViewHolder>firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
                Blog.class,R.layout.layout_post,BlogViewHolder.class,mdatabase
        ) {
            @Override
            protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) {
                viewHolder.setTitle(model.getTitle());
                viewHolder.setDesc(model.getDesc());
                viewHolder.setImage(getApplicationContext(),model.getImage());
                viewHolder.setTime(model.getTime());
            }



        };
        mdatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, "onCancelled: event cancelled");
            }
        });
        mbloglist.setAdapter(firebaseRecyclerAdapter);

    }

    public static class BlogViewHolder extends RecyclerView.ViewHolder {
        View mview;

        public BlogViewHolder(View itemView) {
            super(itemView);
            mview = itemView;
        }

        public void setTitle(String title) {
            TextView post_title = (TextView) itemView.findViewById(R.id.post_title);
            post_title.setText(title);
        }

        public void setDesc(String desc) {
            TextView post_desc = (TextView) itemView.findViewById(R.id.post_description);
            post_desc.setText(desc);
        }

        public void setImage(Context context,String image) {
            PhotoView post_image = (PhotoView) itemView.findViewById(R.id.post_image);
          Glide.with(context).asBitmap().load(image).into(post_image);
        }
        public void setTime(String time) {
            TextView post_desc = (TextView) itemView.findViewById(R.id.post_time);
            post_desc.setText(time);
        }
    }
public类MainActivity扩展了AppCompatActivity{
私人回收站查看mbloglist;
私有数据库参考数据库;
公共静态最终字符串TAG=“Homeactivity”;
私有上下文mcontext=MainActivity.this;
私有静态最终整数活动_NUM=0;
对话框mycustomDialog;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(标记“onCreate:starting”);
mdatabase=FirebaseDatabase.getInstance().getReference().child(“全局”);
mdatabase.keepSynced(true);
mbloglist=(recycleView)findViewById(R.id.recycleView_post);
mbloglist.setHasFixedSize(true);
mbloglist.setLayoutManager(新的LinearLayoutManager(本));
setupBottomNavigationView();
设置工具栏();
mycustomDialog=新建对话框(此对话框);
}
@凌驾
受保护的void onStart(){
super.onStart();
最终ProgressBar ProgressBar=(ProgressBar)findViewById(R.id.ProgressBar\u post);
progressBar.setVisibility(View.VISIBLE);
FirebaseRecyclerAdapter FirebaseRecyclerAdapter=新的FirebaseRecyclerAdapter(
Blog.class,R.layout.layou\u post,BlogViewHolder.class,mdatabase
) {
@凌驾
受保护的void populateViewHolder(BlogViewHolder、Blog模型、int位置){
setTitle(model.getTitle());
setDesc(model.getDesc());
setImage(getApplicationContext(),model.getImage());
setTime(model.getTime());
}
};
mdatabase.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
progressBar.setVisibility(View.GONE);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.d(标记“onCancelled:event cancelled”);
}
});
mbloglist.setAdapter(firebaseRecyclerAdapter);
}
公共静态类BlogViewHolder扩展了RecyclerView.ViewHolder{
视图视图;
公共BlogViewHolder(查看项目视图){
超级(项目视图);
mview=项目视图;
}
公共无效集合标题(字符串标题){
TextView post_title=(TextView)itemView.findViewById(R.id.post_title);
post_title.setText(title);
}
公共void setDesc(字符串desc){
TextView post_desc=(TextView)itemView.findViewById(R.id.post_description);
后描述设置文本(描述);
}
公共void setImage(上下文、字符串图像){
PhotoView post_image=(PhotoView)itemView.findviewbyd(R.id.post_image);
Glide.with(context.asBitmap().load(image).into(post_image);
}
公共无效设置时间(字符串时间){
TextView post_desc=(TextView)itemView.findViewById(R.id.post_time);
post_desc.setText(时间);
}
}
即使他们没有互联网连接,我也可以保存并显示此帖子。并在连接可用时重新加载帖子。

也可以使用

 DatabaseReference db = FirebaseDatabase.getInstance();                                        
 db.setPersistenceEnabled(true);
 mDatabase = db.getReference().child("Global");;
根据—

通过启用持久性,Firebase实时数据库客户端在联机时将同步的任何数据都会持久化到磁盘,并且即使在用户或操作系统重新启动应用程序时也可以脱机使用。这意味着您的应用程序通过使用存储在缓存中的本地数据在线工作

连同

mdatabase.keepSynced(true);

您是否尝试过Firestore?Firebase已在Firestore中实现脱机时支持脱机持久化/保存数据。我不知道Firestore。建议您使用
FirebaseRecyclerAdapter
从Firebase实时数据库检索数据并将其显示在
RecyclerView
中。它会崩溃当我重新点击相同的activity.java.lang.RuntimeException:无法启动activity ComponentInfo{sagarf.com.mce/sagarf.com.mce.Home.MainActivity}:com.google.firebase.database.DatabaseException:调用setPersistenceEnabled()必须在其他任何使用FirebaseDatabase实例之前进行。是的,我以前添加过它。我有一个底部导航视图,每个菜单项都启动一个活动。因此,如果第二次重新启动,它会崩溃。我第一次工作。但当我重新启动活动时,它会崩溃。java.lang.RuntimeException:无法启动活动组件tInfo{sagarf.com.mce/sagarf.com.mce.Home.MainActivity}:com.google.firebase.database.DatabaseException:调用setPersistenceEnabled()必须在其他任何使用FirebaseDatabase实例之前进行。onStart()方法中的上述部分也是如此。