Android 方向更改时处理SQLiteOpenHelper
我尝试创建的应用程序是一个Android 方向更改时处理SQLiteOpenHelper,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我尝试创建的应用程序是一个ViewPager,然后由片段组成 每个片段都有不同的数据,因为它们是从数据库获取的 我将数据库类从Fragment Activity发送到Fragment中的FragmentStatePagerAdapter 代码如下: private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager
ViewPager
,然后由片段组成
每个片段
都有不同的数据,因为它们是从数据库
获取的
我将数据库类从Fragment Activity
发送到Fragment
中的FragmentStatePagerAdapter
代码如下:
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return PageFragment.create(position, student, getApplicationContext(), mDbStudent);
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
mDbStudent是数据库类
我在创建时打开我的mDbStudent
当ondestory
我遇到的问题是,当方向改变时,mDbStudent
被销毁
但是片段仍然从数据库加载数据,因此发生了错误
当onAttach
时,我尝试在片段中获取mDbStudent,但当我快速移动页面时,日志表明我没有关闭mDbStudent
我的问题是当方向改变时,是否有办法处理MDB学生?您需要在活动之外实例化数据库。很可能,您将在许多活动和片段中使用数据库,对吗?您可以创建静态单例,如下所示:
public class Global {
private static Global instance = null;
private Context context;
public Global( Context context ) {
this.context = context.getApplicationContext();
}
public static getInstance( Context context ) {
if( instance == null )
instance = new Global( context );
return instance;
}
public SQLiteOpenHelper getDatabase() {
return ... ;
}
}
然后,在活动中,您可以调用:
Global.getInstance( this ).getDatabase()...
这将存储应用程序的上下文,因此您可以在需要时在全局实例中访问该上下文。。。即使该活动已被销毁
这还允许您打开数据库一次并保持其打开状态,即使方向发生变化。在我的应用程序中,我通常保持DB打开,直到应用程序明确关闭。如果您有一个活动应用程序,我会在onStart
中打开数据库(如果已关闭),然后在onUserLeaveHint()中关闭它。这只会在用户离开应用程序时关闭数据库,但不会在方向改变时关闭数据库。谢谢您的回答,我想我对上下文没有问题。我的问题是何时关闭和打开mDbStudent
。你知道怎么处理吗?谢谢,但我会在创建时打开我的数据库,当方向改变时,它会再次打开。如何修复它?因为如果它打开两次,logcat就会出现,我永远不会关闭上面的DBSee——在onStart中打开数据库,但只有在数据库未打开时才这样做。我不明白为什么getInstance()没有声明任何要返回的内容,而是返回函数底部的实例