2010-06-13 4 views
0

This Android application on Google utilise la méthode suivante pour actualiser la base de données après avoir remplacé le fichier de base de données avec une sauvegarde:Remise à zéro ou actualisation d'une connexion de base de données

public void resetDbConnection() { 
    this.cleanup(); 
    this.db = 
     SQLiteDatabase.openDatabase(
      "/data/data/com.totsp.bookworm/databases/bookworm.db", 
      null, SQLiteDatabase.OPEN_READWRITE); 
} 

Je n'ai pas construit cette application, et je ne suis pas sûr de ce qui se passe. J'essaie de faire fonctionner cette idée dans ma propre application, mais les données semblent être mises en cache par les vues, et l'application continue à afficher les données de la base de données remplacée, même après avoir appelé cleanup() et rouvert la base de données . Je dois terminer et redémarrer l'activité afin de voir les nouvelles données.

J'ai essayé d'appeler invalide sur ma vue TabHost, qui contient à peu près tout. Je pensais que les vues seraient redessiner et rafraîchir leurs données sous-jacentes, mais cela n'a pas eu le résultat escompté.

J'ai fini par redémarrer l'activité par programme, ce qui fonctionne, mais cela semble être une mesure drastique. Y a-t-il un meilleur moyen?

+0

Probablement vous devez requery vos curseurs et/ou notifiydataset de changements. – Pentium10

Répondre

1

D'accord avec Pentium10, au moins conceptuellement. L'application utilise un Cursor pour afficher ses données. Un Cursor dans Android s'apparente à un curseur côté client dans ODBC, en ce sens qu'il s'agit d'une copie en cache de toutes les données représentées par l'ensemble de résultats de la requête.

Maintenant, la façon normale de gérer les modifications dans le contenu de la base de données est d'appeler requery() sur le Cursor. Cela fera onduler ses changements à travers le CursorAdapter à joint ListViews ou autre AdapterViews.

Dans votre cas, je ne suis pas complètement certain que cela fonctionnera puisque vous fermez, remplacez et rouvrez la base de données. Cela ne devrait pas être fait avec un Cursor ouvert sur les données, AFAIK. Donc, dans votre cas, vous devez fermer le Cursor, faire la shuffle de la base de données, puis réexécutez la requête pour obtenir un nouveau Cursor sur votre nouvelle base de données.

+0

Cela semble peu pratique, car j'ai un TabHost avec plusieurs onglets qui ont chacun leur propre curseur ouvert. Je ne suis même pas sûr de la façon dont j'indiquerais au curseur de chaque Tab de faire un requery(). Ce qui semble arriver, c'est que les curseurs se rafraîchissent lorsqu'ils détectent le changement. Par exemple, lorsque j'initie un événement à l'un de mes ListViews qui entraîne une tentative de mise à jour d'une ligne qui n'existe plus dans la base de données, le curseur se rafraîchit et ListView affiche les données correctes. Je ne dis pas que c'est ainsi que je veux que ça se comporte, je le mentionne simplement comme une observation. – cdonner

+0

@cdonner: "Ce qui semble arriver, c'est que les curseurs se rafraîchissent quand ils détectent le changement." Si ce sont des curseurs gérés, c'est éminemment possible. Il est encore peu probable qu'ils apprécieront d'avoir leur base de données arrachée sous eux. Vous pouvez peut-être restaurer votre base de données uniquement lorsque l'application démarre ou à un autre moment lorsque vous savez que vous n'avez aucune connexion à la base de données ouverte. – CommonsWare

+0

Attendre que l'utilisateur fasse quelque chose avec les données et ensuite lui montrer autre chose n'est pas acceptable, bien sûr. Je vais garder mon code qui termine l'activité et la redémarre, car cela garantit que tout est réinitialisé correctement. – cdonner