2010-12-05 25 views
2

J'ai une base de données sqlite remplie dans mon dossier reousrce de l'application. Au démarrage je veux précharger coredata-store avec les données de ce sqlite db. J'utilise NSMigrationManager dans la méthode persistantStoreCoordinator. Cela fonctionne très bien pour la première fois et ajoutera les données au magasin. Mais il ajoutera à nouveau les données à chaque démarrage, de sorte que les données seront dupliquées, après le deuxième démarrage. Comment puis-je resoudre ceci? Dans une base de données j'utiliserais des clés primaires, y a-t-il quelque chose de similaire dans le modèle de données? Ou puis-je comparer les entités-objets?Migration manuelle de CoreData avec NSMigrationManager pour ajouter des données (préchargement)

Merci quatre votre aide, en dessous de la méthode que j'utilise:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator_ != nil) { 
    return persistentStoreCoordinator_; 
} 

NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Raetselspass.sqlite"]; 
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Raetselspass" ofType:@"sqlite"]; 
NSURL *defaultStoreUrl = [NSURL fileURLWithPath:defaultStorePath]; 

/* 
    Set up the store. 
    For the sake of illustration, provide a pre-populated default store. 
    */ 
     // CANNOT USE THIS BELOW: WILL WORK ONCE, BUT WHEN I WILL UPDATE THE APP WITH 
     // NEW DATA TO APPEND, THEN THIS WILL NOT WORK 
// NSFileManager *fileManager = [NSFileManager defaultManager]; 
// If the expected store doesn’t exist, copy the default store. 
// if (![fileManager fileExistsAtPath:storePath]) { 
// if (defaultStorePath) { 
// [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
// } 
// } 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

NSError *error; 
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
    // Update to handle the error appropriately. 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); // Fail 
} 

//migration 
rror:&error]; 
NSError *err = nil; 
NSMigrationManager *migrator = [[NSMigrationManager alloc] initWithSourceModel:[self managedObjectModel] destinationModel:[self managedObjectModel]]; 
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:[self managedObjectModel] destinationModel:[self managedObjectModel] error:&err]; 
NSError *err2; 
if (![migrator migrateStoreFromURL:defaultStoreUrl 
      type:NSSQLiteStoreType 
      options:nil 
     withMappingModel:mappingModel 
     toDestinationURL:storeUrl 
     destinationType:NSSQLiteStoreType 
    destinationOptions:nil 
     error:&err2]) 
{ 
    //handle the error 
} 
NSLog(@"import finished"); 
[migrator release]; 

return persistentStoreCoordinator_; 
} 

Répondre

2

Le code tel que prévu fusionnera le fichier par défaut si elle est présente dans le dossier des documents. Si vous supprimez le fichier après sa fusion, il ne doit pas être chargé à chaque fois. Vous pouvez définir un indicateur par défaut utilisateur à enregistrer s'il a déjà été fusionné.

Une meilleure solution consisterait à créer un magasin persistant de données de base avec les données par défaut et à l'inclure dans l'ensemble d'applications. Au premier lancement, copiez ce fichier dans le dossier de documents et assignez-le simplement au magasin persistant. Cette méthode serait plus rapide et vous ne devriez pas vous inquiéter de l'échec de la fusion.

+0

Pourriez-vous expliquer ce que vous entendez par "l'assigner au magasin persistant". Je suis confus comment votre recommandation est différente. – Flaviu