10
votes

SQLite DB à faire pendant la mise à jour de l'application iPhone

J'ai des questions générales sur les mises à jour de l'application iPhone qui impliquent SQLite DB.

  1. Avec la nouvelle mise à jour, le DB SQLite DB existant est-il écrasé par une copie du nouveau?

  2. Si la mise à jour n'implique aucun changement de schéma, l'utilisateur doit pouvoir réutiliser la base de données existante avec ses données enregistrées, non? (Si la base de données existante n'est pas écrasée à partir de 1 ci-dessus)

  3. S'il y a des changements de schéma, quelle est la meilleure façon de transférer des données de l'ancienne base de données dans la nouvelle? Quelqu'un peut-il me donner des lignes directrices et un exemple de code?


1 commentaires

3 Réponses :


1
votes

1) Le fichier de base de données n'est pas enregistré dans le cadre de l'ensemble de l'application, il ne sera pas automatiquement écrasé.

2) oui - toutes leurs données seront enregistrées. En fait, la base de données ne sera pas touchée du tout par la mise à jour.

3) C'est le délicat - lu Ce document fantastique intéressant - en particulier la partie sur la migration légère - si les changements de schéma sont petits et suivent un certain ensemble de règles, ils se produiront automatiquement et l'utilisateur ne remarquera pas. Toutefois, si des modifications majeures sont des modifications majeures du schéma, vous devrez écrire votre propre code de migration (c'est-à-dire dans ces liens)

J'ai toujours réussi à vous échapper avec des migrations légères moi-même - c'est de loin plus facile que de le faire vous-même.


2 commentaires

Le lien dans le n ° 3 ne s'applique qu'à l'utilisation de données de base. La question semble être sur l'utilisation directement de SQLite.


Le document fait référence à la migration de données à l'aide de données de base ... Je recherche quelque chose comme le transfert de données direct à partir de SQLite DB (nouveau DB) de SQLite DB (existant avec les données des utilisateurs)



0
votes

Ce que je fais est que je crée une copie de travail de la base de données dans le répertoire des documents. La copie principale vient avec le paquet. Lorsque je mettez à jour l'application, j'ai alors la possibilité de faire une nouvelle copie sur la copie de travail ou de le laisser.


2 commentaires

Et si vous avez besoin de transférer des données sur la nouvelle copie? Y a-t-il des échantillons de scripts de migration que vous pouvez me signaler?


J'exécute généralement deux bases de données, une statique qui conserve toutes les tables relativement statiques et une dynamique. La migration n'est donc généralement pas un problème car je ne mettant à jour que la base de données requise. La migration n'a pas été une question.



21
votes
  1. Seuls les fichiers à l'intérieur de l'ensemble de l'application sont remplacés. Si le fichier de base de données figure dans le répertoire de documents de votre application, il ne sera pas remplacé. (Notez que si vous modifiez des fichiers à l'intérieur de votre ensemble d'applications, la signature de code ne sera plus valide et l'application ne se lancera pas. Donc, à moins que vous utilisiez une base de données en lecture seule, il faudrait figurer dans le répertoire des documents.)

  2. oui.

  3. Ce qui dépend mieux des données. Vous n'allez pas trouver de code d'exemple pour une telle question générique. Tout d'abord, vous devez détecter que votre application fonctionne avec une ancienne version de DB. Ensuite, vous devez la mettre à niveau.

    Pour vérifier les versions:

    • Vous pouvez utiliser un nom de fichier différent pour le nouveau schéma. Si la version2.db n'existe pas, mais la version1.db fait, effectue une mise à niveau.
    • Vous pouvez intégrer une version de schéma dans votre base de données. J'ai une table appelée métadata avec un nom nom et la colonne . J'utilise cela pour stocker certaines valeurs générales, y compris un numéro de donnéesVersion . Je vérifie ce numéro lorsque j'ouvre la base de données et s'il est inférieur à la version actuelle, je fais une mise à niveau.
    • Au lieu de créer une table, vous pouvez également utiliser user_version Pragma Pour vérifier et stocker un numéro de version.
    • Vous pouvez vérifier directement la structure de la table: recherchez l'existence d'une colonne ou d'une table.

      Pour mettre à niveau:

      • Vous pouvez mettre à niveau en place en utilisant une série de commandes SQL. Vous pouvez même stocker un fichier SQL dans votre ensemble d'applications en tant que ressource et simplement le transmettre à sqlite3_exec pour faire tout le travail. (Faites-le à l'intérieur d'une transaction, au cas où il y a un problème!)
      • Vous pouvez mettre à niveau la mise à niveau en copiant des données d'un fichier de base de données à une nouvelle.

        Si votre mise à niveau peut fonctionner longtemps (plus d'une seconde), vous devez afficher un écran de mise à niveau, expliquer à l'utilisateur ce qui se passe.


3 commentaires

Remarque mineure sur la vérification de la version: Au lieu d'utiliser une table séparée pour la version de schéma, vous pouvez également utiliser le pragma "user_version" intégré ( sqlite.org/pragma.html#pragma_schema_version ).


Oh cool! J'aimerais avoir su que j'avais su. Va éditer ma réponse.


Mise à niveau de version1.db et de version2.db, etc. Si fort? Nous avons d'autres options?