2011-02-09 4 views
1

J'ai une application iPhone qui utilise CoreData pour le stockage.iPhone CoreData migration de données seulement

Le magasin persistant (une base de données sqlite3) est livré avec plusieurs de ses entités remplies de données. Ces données sont utilisées pour créer divers menus et options dans l'application. Appelons ces données "données d'application".

Plusieurs autres entités sont utilisées par l'application pour stocker les données utilisateur.

Bien que le schéma change rarement, j'ai souvent besoin de mettre à jour les données d'application pour fournir de nouvelles options aux utilisateurs. J'ai un script MacRuby qui récupère les nouvelles données d'un tas de fichiers CSV et met à jour la base de données sqlite3 sur mon ordinateur de développement, mais je ne suis pas sûr de la meilleure façon de mettre à jour les applications déployées existantes avec les nouvelles données d'application (rappelez-vous, pas de changement de schéma) sans affecter les données de l'utilisateur.

Des idées?

_ Mise à jour _

Après un peu de réflexion, je commence à me orienté vers la mise en application pour télécharger un nouveau fichier sqlite3 à partir d'un serveur Web qui contient les nouvelles données. Une fois reçue, mon application va copier les données du fichier de mise à jour sqlite3 dans le fichier de base de données de l'application, en remplaçant complètement les données de l'application, mais sans toucher aux données de l'utilisateur.

Un mécanisme pour déterminer si une mise à jour a été appliquée peut utiliser un fichier texte avec un seul numéro de version de base de données que l'application téléchargera périodiquement. Si ce nombre est plus grand que le numéro de la mise à jour précédente (qui est stockée localement), la mise à jour se poursuivra, sinon elle l'ignorera.

+0

Bonjour Futureshocked, avez-vous trouvé la réponse? Je suis également confronté au même problème. J'ai une entité appelée DefaultValues ​​que je veux mettre à jour avec quelques nouveaux enregistrements sans toucher les données des utilisateurs présents dans d'autres entités. Je ne sais pas exactement ce que je dois faire ?? –

+0

Je ne l'ai pas encore terminé, mais la stratégie que je prévois de suivre est de regrouper les nouvelles données dans un fichier sqlite3 (même si cela n'a pas d'importance, il pourrait s'agir d'un simple fichier json), le télécharger sur l'iPhone par l'application, puis ouvert et avoir les données copiées comme requis dans la base de données de l'application. J'espère que cela t'aides. J'ai mis en place la partie qui télécharge le fichier sqlite3 sur le téléphone, puis manque de temps :-( – futureshocked

Répondre

0

Si vous parlez d'ajouter de nouvelles entrées dans le magasin sqlite3, y a-t-il une raison pour laquelle vous ne pourriez pas le faire au lancement de l'application? Je n'ai pas eu à le faire moi-même, mais je ne vois pas pourquoi vous ne pourriez pas créer une liste de propriétés contenant les données dont vous avez besoin et effectuer les mises à jour au lancement de l'application.

NSString *applicationDataPath = [[NSBundle mainBundle] pathForResource:@"ApplicationData" ofType:@"plist"]; 
NSString *previousVersion = [[NSUserDefaults standardUserDefaults] stringForKey:@"VERSION"]; 

NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

/* Don't bother processing updates if the version last run is the same as the current version. */ 
if (! [previousVersion isEqualToString:currentVersion]) 
{ 
    NSArray *versionList = [applicationData objectForKey:@"Versions"]; 

    BOOL process = (nil == previousVersion); 
    for (NSDictionary *versionData in versionList) 
    { 
    NSString *version = [versionData objectForKey:@"version"]; 
    if (process) 
    { 
     // Send dictionary for this version update to some method to process it.. 
     [self processUpdate:versionData]; 
    } 

    if (!process && [version isEqualToString:previousVersion]) 
     process = YES; 
    } 
}  

idée étant que le plist contient un tableau de dictionnaire décrivant chaque version de l'application et les données qui devraient mis à jour pour cette version. L'exemple de plist que j'ai ci-dessous manque de tous les détails nécessaires, donc c'est juste un bout pour avoir l'idée. En outre, aucune idée si le code fonctionne réellement;) Juste comment je pense que je pourrais le faire si je devais faire face à la même chose, en supposant que je comprends votre problème correctement.

Notez également que vous souhaitez mettre à jour la version précédente stockée dans les valeurs par défaut utilisateur au lancement de l'application après la mise à jour des données afin qu'elle ne s'exécute qu'une seule fois.

[{ Versions = ( { data = { 1 = { entité = Menu; }; }; version = "1.1"; }, { data = { 1 = { entity = Menu; }; }; version = "1.2" ; }, { data = { 1 = { entité = Menu; }; }; version = "1.3"; }, { data = { 1 = { entité = Menu; }; }; version = "2.0"; }, { données = {1 = { entity = Menu; }; }; version = "2.5"; } ); }]

+0

Merci Mike, cela ne correspond pas exactement à ma situation.J'ai une base de données sqlite3 utilisée pour la persistance par CoreData dans mon application. est ~ 4 Mo, et contient deux ensembles de tables: une qui contient des données utilisateur et une qui contient des données d'application.Le gros de la base de données est des données d'application, et c'est ce que je dois pouvoir remplacer par un nouvel ensemble (sans affecter les données de l'utilisateur). – futureshocked

Questions connexes