2014-05-04 7 views
1

Finalement, cette migration a fonctionné, ce qui a été très pénible.Migration CoreData dans iOS 7

source code

Tout fonctionne très bien dans iOS6 mais dans un accident d'application iOS 7

+0

Crashes avec quel (s) message (s) d'erreur et/ou symptôme (s), et à quelle partie du processus de migration? Dire qu'il se bloque est complètement inutile sans quelques détails. –

+0

tout d'abord merci pour votre réponse de sorte qu'il plante lorsque je tente d'ajouter mon magasin persistant à mon coordinateur de magasin persistant avec erreur CoreData: erreur: échec de lecture des métadonnées plist avec des octets de données: <30> –

Répondre

2

Sur la base de vos commentaires et un rapport de bogue à http://openradar.io/15555487 Je devine que le message complet est quelque chose comme:

CoreData: error: failure reading metadata plist with data bytes: <33> 
Unable to open database. Error: The file couldn’t be opened because it isn’t in the correct format. 
Info: { 
    NSUnderlyingException = "An error <null> occurred converting the metadata plist data: <33>"; 
} 

Basé également sur ce rapport, plus votre code source: vous quittez presque certainement les anciens fichiers wal et shm après la migration, ce qui cause des problèmes après la migration ration. À partir de iOS 7, Core Data utilise la journalisation en mode WAL. Cela signifie que vous devez vous soucier de quelques fichiers supplémentaires lorsque vous copiez ou supprimez un magasin persistant. Si le nom de votre magasin est foo.sqlite, il existe également un foo.sqlite-wal et un foo.sqlite-shm dans le même répertoire.

Votre code supprime l'ancien fichier SQLite et le remplace par le nouveau, mais laisse les fichiers journaux existants en place. Cela provoque des données incohérentes, car les fichiers journaux ne correspondent plus au fichier SQLite principal. SQLite et Core Data ne peuvent pas donner un sens à ce qui reste, donc l'application se bloque.

La solution est la plus susceptible de s'assurer de nettoyer les fichiers supplémentaires. Lorsque vous effectuez cet appel:

success = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error]; 

... supprimer également les deux fichiers supplémentaires.

Pour les travaux futurs, il est utile de placer le fichier de stockage permanent dans son propre répertoire sans autres fichiers. Ensuite, si vous avez besoin de supprimer le magasin, vous pouvez simplement supprimer le répertoire en une seule étape, sans avoir à vous soucier des autres fichiers que SQLite ou Core Data pourraient avoir créés.