2017-02-07 5 views
1

J'ai créé une application sur laquelle je reviens il y a environ un an et demi. C'est le projet sur lequel j'ai coupé mes dents de Swift et évidemment beaucoup de choses ont changé depuis, à la fois dans la langue et dans mes capacités de Swift.Prévention d'un plantage de CoreData pour la mise à niveau des utilisateurs

Hier, pour la première fois, j'ai mis à jour mon modèle CoreData unique pour ajouter un attribut de chaîne optionnel. J'ai fait le bit de génération de fichier et j'ai vérifié dans la colonne de l'inspecteur que le nouveau modèle de données est sélectionné de manière appropriée.

Sur mon simulateur et les appareils de test, j'ai besoin de supprimer l'ancienne version de l'application pour installer la nouvelle version ou je reçois un plantage. Je suppose que c'est juste une partie du processus de l'environnement de développement. Comment puis-je m'assurer que les utilisateurs de mise à niveau n'auront pas à supprimer et à réinstaller lorsqu'ils effectueront une simple mise à jour depuis l'App Store? Je suppose que Xcode/CoreData/Apple ont ce traitement avec des scripts internes ou des processus qui sont invisibles à l'utilisateur, "ça marche". Mais je voulais publier ceci ici pour comprendre s'il y a quelque chose d'autre que je dois faire pour assurer une transition en douceur de v1 à v1.1 pour l'utilisateur.

Tout ce que j'ai fait était une colonne de chaîne optionnelle, comme je l'ai mentionné. Je suppose que toutes les données utilisateur existantes seront migrées vers le nouveau schéma avec le nouveau champ nil.

Toutes les pensées ici seraient très bien accueillies et appréciées. Merci!

+0

Vous avez des choix à faire à la façon dont vous souhaitez migrer de l'ancienne version à la nouvelle, je vous suggère de lire ici un peu : https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweightMigration.html –

+0

Merci, allez jeter un oeil –

+1

Ce crash ne fait pas partie du processus de développement. Vous devez corriger cela avant la publication. –

Répondre

2

Si votre application tombe en panne dans le simulateur lors de la mise à niveau, vos utilisateurs auront également des plantages.

Pour éviter cela, vous devez vous assurer que vous suivez ces étapes:

  1. Assurez-vous que vous ne modifiez pas la version originale de votre modèle de données de quelque façon.
  2. Dans Xcode, sélectionnez votre fichier xcdatamodel, puis dans le menu, choisissez Editeur> Ajouter une version du modèle ...
  3. Xcode proposera un nouveau nom de version, basé sur le modèle actuel. Faites une note mentale du nom de la nouvelle version, puis cliquez sur Terminer.
  4. Sélectionnez à nouveau le fichier xcdatamodel, allez dans Inspecteur de fichiers et sous Version du modèle, sélectionnez le nouveau nom de version pour en faire votre version actuelle.
  5. Dans Project Navigator, sélectionnez la nouvelle version de xcdatamodel. Ajoutez votre attribut.

Il est important de suivre ces étapes dans cet ordre. Si vous ajoutez votre attribut avant de créer le nouveau modèle ou d'en faire votre version actuelle, vous aurez des plantages.

EDIT: Cela ne fonctionnera que si vous activez les migrations légères. Ceci est un extrait de code de la façon de le faire:

let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] 

do { 
    //coordinator is an NSPersistentStoreCoordinator 
    try coordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options 
} catch var error as NSError { 

    // handle error however you want here...    
    abort() 
} 
+0

Merci Mike. De plus, ai-je besoin de générer une sous-classe pour un objet NSManagedObject? Est-ce que c'est parti d'ici? –

+0

Cela a fonctionné parfaitement. Ajouter une modification pour les utilisateurs qui la trouveront plus tard –

+0

Merci encore pour votre aide Mike! –