101 votes

Android SQLite DB Quand fermer

Je travaille avec une base de données SQLite sur Android. Mon gestionnaire de base de données est un singleton et ouvre maintenant une connexion à la base de données lorsqu'elle est initialisée. Il est prudent de laisser la base de données ouverte tout le temps afin que, lorsque quelqu'un appelle ma classe pour travailler avec la base de données, celle-ci soit déjà ouverte? Ou devrais-je ouvrir et fermer la base de données avant et après chaque accès est nécessaire. Y a-t-il un mal à le laisser ouvert tout le temps?

Merci!

59voto

binnyb Points 10492

je voudrais le garder ouvert tout le temps, et proche d'une certaine cycle de vie de la méthode telle qu' onStop ou onDestroy. de cette façon, vous pouvez facilement vérifier si la base de données est déjà en cours d'utilisation en appelant isDbLockedByCurrentThread ou isDbLockedByOtherThreads sur le single SQLiteDatabase objet à chaque fois avant de l'utiliser. cela permettra d'éviter de multiples manipulations de la base de données et enregistrer votre application à partir d'un crash potentiel

donc, dans votre singleton, vous pouvez avoir une méthode de ce genre pour obtenir votre seul SQLiteOpenHelper objet:

private SQLiteDatabase db;
private MyDBOpenHelper mySingletonHelperField;
public MyDBOpenHelper getDbHelper() {
    db = mySingletonHelperField.getDatabase();//returns the already created database object in my MyDBOpenHelper class(which extends `SQLiteOpenHelper`)
    while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()) {
        //db is locked, keep looping
    }
    return mySingletonHelperField;
}

donc, lorsque vous voulez utiliser votre ouverte objet d'assistance, appeler cette méthode de lecture(assurez-vous qu'il est filetée)

une autre méthode dans votre singleton peut être(appelée à CHAQUE FOIS avant de vous essayer à l'appel de la lecture ci-dessus):

public void setDbHelper(MyDBOpenHelper mySingletonHelperField) {
    if(null == this.mySingletonHelperField) {
        this.mySingletonHelperField = mySingletonHelperField;
        this.mySingletonHelperField.setDb(this.mySingletonHelperField.getWritableDatabase());//creates and sets the database object in the MyDBOpenHelper class
    }
}

vous pouvez fermer la base de données dans le singleton:

public void finalize() throws Throwable {
    if(null != mySingletonHelperField)
        mySingletonHelperField.close();
    if(null != db)
        db.close();
    super.finalize();
}

si les utilisateurs de votre application ont la possibilité de créer de nombreuses base de données des interactions très rapidement, vous devriez utiliser quelque chose comme je l'ai démontré ci-dessus. mais si il est minime base de données des interactions, je ne serais pas s'inquiéter à ce sujet, et il suffit de créer et de fermer la base de données à chaque fois.

-3voto

barmaley Points 7307

Dans mon application, je garde SQLite ouvert tout le temps et ne le ferme que lorsque la dernière / dernière activité est sur le point de se fermer. Pour contrôler que je possède la super classe MyActivity qui est le parent de toutes mes activités, comme:

 public class ControlActivity extends Activity    
{
    private static ArrayList<Activity> activities=new ArrayList<Activity>();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        activities.add(this);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        activities.remove(this);
        if(activities.size()==0) //last activity 
            //release resources and so on
    }

 }
 

-9voto

Leander Points 223

Créez votre propre contexte d'application, puis ouvrez et fermez la base de données à partir de là. Cet objet possède également une méthode OnTerminate () que vous pouvez utiliser pour fermer la connexion. Je n'ai pas encore essayé, mais cela semble être une meilleure approche.

@binnyb: Je n'aime pas utiliser finalize () pour fermer la connexion. Cela pourrait fonctionner, mais d'après ce que je comprends, écrire du code dans une méthode Java finalize () est une mauvaise idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X