2013-03-16 2 views
3

Приложения, которые я пытаюсь создать, составляют ViewPager, тогда состоят из Fragments.Ручка SQLiteOpenHelper при изменении ориентации

Каждый 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 класс базы данных.

Я открываю mDbStudent в onCreate

И я закрываю мой mDbStudent когда onDestroy

У меня есть проблема, когда изменения ориентации, mDbStudent был разрушен но fragment еще погрузка данные из базы данных, поэтому возникает ошибка.

Я пытаюсь получить mDbStudent в Fragment когда onAttach, но когда я перехожу страницы очень быстро, лог заявил, что я не закрывал mDbStudent

Мой вопрос Есть ли способ для обработки mDbStudent при изменении ориентации?

ответ

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

Это сохраняет контекст приложения, так что вы можете получить доступ, что в глобальном случае везде, где требуется ... даже если деятельность была уничтожена.

Это также позволит вам открыть базу данных один раз и оставить ее открытой, даже путем изменения ориентации. В моих приложениях я обычно оставляю DB открытым до тех пор, пока приложение не будет закрыто явно. Если у вас есть приложение для одной активности, я бы открыл базу данных, если она была закрыта, в onStart и закроет ее в onUserLeaveHint(). Это приведет к закрытию базы данных только в том случае, если ее использование покинет приложение, но не изменится ориентация.

+0

Спасибо за ваш ответ, я думаю, что у меня нет проблем с «Контекстом». Моя проблема в том, когда нужно закрыть и открыть «mDbStudent». Вы знаете, как с этим справиться? – Sieryuu

+0

Измененный ответ. 'onUserLeaveHint()' отлично работает для этого. – 323go

+0

Спасибо, но я открываю свою базу данных onCreate, когда изменение ориентации снова откроется. как это исправить? потому что если он откроется дважды, появится логарифм, я никогда не закрою DB – Sieryuu

Смежные вопросы