方向更改时处理SQLiteOpenHelper

时间:2013-03-16 01:52:57

标签: android android-fragments android-viewpager

我尝试创建的应用是ViewPager,然后由Fragments组成。

每个Fragment都有不同的数据,因为它来自Database

我将数据库类从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 是数据库类。

我在onCreate

打开 mDbStudent

我在onDestroy

时关闭 mDbStudent

我遇到的问题是当方向发生变化时,mDbStudent被破坏了 但是fragment仍然从数据库加载数据,因此发生错误。

我尝试在Fragment onAttach时使用mDbStudent,但当我快速移动页面时,日志声明我没有关闭 mDbStudent < / p>

我的问题是当方向发生变化时,有没有办法处理 mDbStudent

1 个答案:

答案 0 :(得分:0)

您需要在Activity之外实例化数据库。最有可能的是,你将在许多活动和片段中使用数据库,对吧?您可以创建一个静态单例,如下所示:

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()...

这将存储应用程序的Context,因此您可以在需要的时候在Global实例中访问它...即使Activity已被销毁。

这也允许您打开数据库一次并保持打开状态,即使通过方向更改也是如此。在我的应用程序中,我通常会将数据库保持打开状态,直到应用程序显式关闭如果您有单活动应用,我会在onStart中打开数据库(如果已关闭),并在onUserLeaveHint()中将其关闭。这只会在用户离开应用程序时关闭数据库,但不会在方向更改时关闭。