2013-03-16 2 views
3

Les applications que j'essaie de créer sont un ViewPager puis se composent de Fragments.Gérer SQLiteOpenHelper lorsque l'orientation change

Chaque Fragment a des données différentes, car l'a obtenu de Database. J'envoie la classe Database de Fragment Activity à Fragment à l'intérieur du FragmentStatePagerAdapter.

Voici le code:

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 est la classe de base de données.

J'ouvre mDbStudent à onCreate

Et je ferme mDbStudent quand onDestroy

Le problème que j'ai est quand les changements d'orientation, le mDbStudent a été détruit mais le fragment chargement encore la données de la base de données, par conséquent l'erreur se produit.

J'essaie d'obtenir le mDbStudent dans le Fragment quand onAttach, mais quand je me déplace les pages très rapide, il se logger déclaré que je ne ferme pas la mDbStudent

Ma question est Est-il un moyen gérer le mDbStudent lorsque l'orientation change?

Répondre

0

Vous devrez instancier votre base de données en dehors de l'activité. Très probablement, vous utiliserez la base de données dans de nombreuses activités et fragments, n'est-ce pas? Vous pouvez créer un singleton, comme ceci:

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

Ensuite, dans votre activité, vous pouvez appeler:

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

Ce stocke le contexte, de sorte que vous pouvez accéder qu'en instance globale de l'application whereever nécessaire ... même si l'activité a été détruite depuis. Ceci vous permettra également d'ouvrir la base de données une fois et de la garder ouverte, même par des changements d'orientation. Dans mes applications, je laisse généralement la base ouverte jusqu'à ce que l'application soit fermée explicitement. Si vous avez une application mono-activité, j'ouvre la base de données, si elle est fermée, dans onStart et fermez-la en onUserLeaveHint(). Cela fermera seulement la base de données si l'utilisation quitte l'application, mais pas sur les changements d'orientation.

+0

Merci pour votre réponse, je pense que je n'ai aucun problème avec le 'Context'. Mon problème est quand fermer et ouvrir le 'mDbStudent'. Savez-vous comment le gérer? – Sieryuu

+0

Réponse modifiée. 'onUserLeaveHint()' fonctionne bien pour cela. – 323go

+0

Merci, mais j'ouvre ma base de données l'onCreate, quand l'orientation change, il va s'ouvrir à nouveau. comment le réparer? parce que si elle s'ouvre deux fois le logcat apparaîtra Je ne ferme jamais la DB – Sieryuu

Questions connexes