处理屏幕旋转时的SQLiteOpenHelper问题

3

我尝试创建的应用程序是由 ViewPagerFragments 组成的。

每个 Fragment 都有不同的数据,因为它们从 Database 中获取。

我将 Database 类从 Fragment Activity 发送到 FragmentStatePagerAdapter 内的 Fragment

以下是代码:

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 仍然从数据库加载数据,因此会出现错误。

我尝试在 FragmentonAttach 中获取 mDbStudent,但是当我快速移动页面时,日志显示我没有关闭 mDbStudent

我的问题是:有没有一种方法可以处理屏幕方向改变时的 mDbStudent

1个回答

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 ... ;
    }
}

然后,在您的Activity中,您可以调用:

Global.getInstance( this ).getDatabase()...

这个存储应用程序的上下文,所以你可以在全局实例中随时访问它...即使活动已经被销毁。

这也允许您打开数据库一次并保持打开状态,即使方向发生改变。在我的应用程序中,我通常保持数据库打开,直到应用程序明确关闭。如果您有一个单活动应用程序,我会在onStart中打开数据库(如果关闭),并在onUserLeaveHint()中关闭它。这只会在用户离开应用程序时关闭数据库,而不是在方向更改时关闭。


谢谢你的回答,我想Context没有问题。我的问题是何时关闭和打开mDbStudent。你知道该如何处理吗? - Sieryuu
谢谢,但我在onCreate中打开了我的数据库,当方向改变时它会再次打开。如何解决?因为如果它打开两次,logcat将出现,而我从未关闭过数据库。 - Sieryuu
请参见上文--在onStart中打开数据库,但仅在其未打开时执行。 - 323go
我不明白为什么你的getInstance()函数没有声明任何返回值,但是在函数底部你却返回了一个实例。 - Sieryuu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接