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()没有声明任何要返回的内容,而是返回函数底部的实例