2016-02-08 1 views
0

nous utilisons ormlite avec succès dans notre application android; pour maintenir les versions de base de données, nous utilisons une approche comme ici: http://www.michenux.net/android-database-sqlite-creation-upgrade-245.htmlonUpgrade condition de course dans l'application en cours d'exécution

Ces derniers temps, nous avons vu « activité paranormale » dans le domaine des applications étant dans les bases de données indique qu'ils ne pouvaient pas « être sanely », et tentent de trouver explications.

On pourrait être que, lorsqu'un en cours d'exécution App est mis à jour automatiquement par Google Play, le onUpgrade() est exécutée, des tables à langer et des données, tandis que l'ancien (ou le nouveau?) App, ou peut-être leurs IntentServices simultanément accéder à la base de données, et obtenir des résultats étranges.

(Malheureusement, il n'y a pas de moyen facile de simplement dire "arrêter complètement mon application avant la mise à niveau, faire la mise à niveau, puis redémarrer complètement." Il y a l'intention MY_PACKAGE_REPLACED, mais les opinions sur la façon de l'utiliser varient ... Donc, ma question est, y at-il une sauvegarde en place qui fera fonctionner onUpgrade() exclusivement, c'est à dire bloquer ou verrouiller ou synchroniser quoi que ce soit, pour s'assurer qu'un autre thread n'accède pas à ma table pendant que je supprimez une colonne (c'est-à-dire renommez, recréer, recopiez les données de l'ancien onglet).

Si non, comment pourrais-je réaliser une telle chose de la manière la plus sûre?

Merci & Cordialement.

+0

Faible hack ici juste pour voir si cela fonctionnerait, mais vous pouvez essayer de définir une variable statique que vous définissez à true lorsque vous mettez à jour et false lorsque vous avez terminé. Vous devez vous assurer que le processus de mise à niveau s'exécute de manière asynchrone. Vous pourriez alors vérifier ce drapeau avant de faire des demandes potentiellement corrompues. Cela ne semble pas idéal, mais peut-être? – zgc7009

+2

Est-ce que Google Play n'arrête pas l'application avant d'essayer de la mettre à niveau? –

+0

Question connexe: http://stackoverflow.com/questions/17794265/will-google-play-service-update-a-running-app. Malheureusement, il n'y a pas de réponse ;-( –

Répondre

0

Bon, alors -

l'analyse approfondie exposée une autre (fait main) question (dans notre code) qui a causé tous ces problèmes. Donc, pour ne pas répandre de rumeurs: Il semble qu'il y ait non condition de course dans onUpgrade()!

Il aurait été bon de savoir s'il est bon d'avoir un bloc de transaction (exclusif?) Pour onUpgrade(), bien que ... J'ai une migration en utilisant begin transaction, et sqlite renvoie une erreur transactions imbriquées, donc je suis assez sûr qu'il n'y en a pas autour de onUpgrade() automatiquement.

Pour des précisions sur d'autres questions Oui, les applications sont interrompues avant d'être mises à niveau. Seuls les services peuvent avoir besoin de relire la configuration, et les alarmes (temporisateurs) peuvent nécessiter un redémarrage.