2017-10-10 5 views
0

J'utilise NSKeyedArchiver() pour enregistrer et charger des objets dans Swift. Le problème est lorsque les variables d'objet changent, comme ajouter une nouvelle variable dans l'objet, NSKeyedArchiver() ne peut pas décoder les derniers objets enregistrés.Enregistrer et charger des données d'objet avec NSKeyedArchiver - perte de données après modification des variables d'objet

func tripsDataFilePath() -> URL { 
    return getDocumentsDirectory().appendingPathComponent("Data.plist") 
} 

Le code que je me sers pour sauver:

func saveData() { 
    NSKeyedArchiver.archiveRootObject(data, toFile: dataFilePath().path) 

} 

et le code de chargement:

func loadData() { 
    if let data = NSKeyedUnarchiver.unarchiveObject(withFile: dataFilePath().path) { 
     project = data as! [Project] 
    } 
} 

Est-il possible de prévenir la perte de données (ne peut pas charger derniers objets) pour quand changer la structure de l'objet?

Ce n'est pas important lors du développement de la première version de l'application iOS. Mais imaginez que les utilisateurs ont téléchargé l'application et dans les nouvelles versions, je veux ajouter de nouvelles fonctionnalités qui nécessitent des modifications aux objets de données actuels! alors les utilisateurs perdront toutes les données.

+0

Pourriez-vous utiliser NSKeyedArchiver à la place? – jervine10

+0

Sentez-vous libre de gérer l'erreur appropriée plutôt que d'imprimer une chaîne littérale générique (il y a plusieurs erreurs distinctes que le décodeur peut "lancer") et écrivez une logique pour migrer les anciennes versions. – vadian

+0

Vous avez demandé s'il gère la perte de données. Je le crois. Nous utilisons NSKeyedArchiver dans notre application et ne perdons jamais de données sur les mises à jour. Cependant, vous devrez migrer les données appropriées et fournir des valeurs par défaut pour les nouveaux champs que vous ajoutez. – jervine10

Répondre

0

J'ai découvert que le problème venait du format de fichier.

j'ai utilisé ce nom pour l'enregistrement NSKeyedArchiver Objet: « Data.plist »

et quand j'ai supprimé le format « .plist », le problème a été résolu.