Mise à jour & amp; modification des fichiers de paramètres avec les nouvelles versions d'une application

StackOverflow https://stackoverflow.com/questions/1609305

Question

J'ai un fichier plist de paramètres par défaut dans le dossier des ressources de mon application et lors du premier lancement qui est copié dans le dossier des documents.

Dans les versions successives de l'application, comment puis-je fusionner les paramètres de plist dans leurs documents avec de nouvelles clés & amp; des valeurs (éventuellement imbriquées) ajoutées depuis la version précédente?

J'ai vu un modèle dans lequel les propriétés sont réellement créées en tant que NSDictionary dans l'application (avec tous les paramètres par défaut), puis les paramètres actuels enregistrés dans le fichier de liste de contrôle sont fusionnés avec ce dictionnaire, puis enregistrés au-dessus du fichier. plist actuel.

Est-ce une bonne approche? Si tel est le cas, comment procéder pour fusionner des NSDictionary pouvant comporter plusieurs valeurs imbriquées avec des sous-tableaux et des sous-dictionnaires?

De même, est-il conseillé de créer un fichier plist personnalisé distinct pour les paramètres ou devez-vous toujours utiliser NSUserDefaults? NSUserDefaults gère-t-il la gestion des versions et la modification des valeurs par défaut?

Merci beaucoup,

Mike

Était-ce utile?

La solution

D'accord, je pense avoir trouvé le meilleur moyen de le faire:

- (void)readSettings {

    // Get Paths
    NSString *defaultSettingsPath = [[NSBundle mainBundle] pathForResource:@"DefaultSettings" ofType:@"plist"];
    NSString *settingsPath = [self.applicationDocumentsPath stringByAppendingPathComponent:@"Settings.plist"];

    // Read in Default settings
    self.settings = [NSMutableDictionary dictionaryWithContentsOfFile:defaultSettingsPath];

    // Read in Current settings and merge
    NSDictionary *currentSettings = [NSDictionary dictionaryWithContentsOfFile:settingsPath];
    for (NSString *key in [currentSettings allKeys]) {
        if ([[self.settings allKeys] indexOfObject:key] != NSNotFound) {
            if (![[currentSettings objectForKey:key] isEqual:[self.settings objectForKey:key]]) {

                // Different so merge
                [self.settings setObject:[currentSettings objectForKey:key] forKey:key];

            }
        }
    }

}

- (void)saveSettings {
    if (self.settings) {
        NSString *settingsPath = [self.applicationDocumentsPath stringByAppendingPathComponent:@"Settings.plist"];
        [self.settings writeToFile:settingsPath atomically:YES];
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top