Core data 使用NSMigrationManager手动CoreData迁移以附加数据(预加载)

Core data 使用NSMigrationManager手动CoreData迁移以附加数据(预加载),core-data,migration,preload,manual,Core Data,Migration,Preload,Manual,我的app reousrce文件夹中有一个已填充的sqlite数据库。启动时,我想用这个sqlite db的数据预加载coredata存储。我在persistantStoreCoordinator方法中使用NSMigrationManager。这在第一次使用时效果很好,可以将数据附加到存储中。但它会在每次启动时再次附加数据,因此在第二次启动后,数据将被复制。我怎样才能解决这个问题?在数据库中,我会使用主键,数据模型中是否有类似的东西?或者我可以比较实体对象吗 感谢您的帮助,以下是我使用的方法:

我的app reousrce文件夹中有一个已填充的sqlite数据库。启动时,我想用这个sqlite db的数据预加载coredata存储。我在persistantStoreCoordinator方法中使用NSMigrationManager。这在第一次使用时效果很好,可以将数据附加到存储中。但它会在每次启动时再次附加数据,因此在第二次启动后,数据将被复制。我怎样才能解决这个问题?在数据库中,我会使用主键,数据模型中是否有类似的东西?或者我可以比较实体对象吗

感谢您的帮助,以下是我使用的方法:

- (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_;
}

如果默认文件位于documents文件夹中,则提供的代码将合并该文件。如果在合并文件后删除该文件,则不应每次都加载该文件。您可以将用户默认标志设置为记录以前是否合并过的内容


更好的解决方案是使用默认数据创建一个核心数据持久存储,并将其包含在应用程序包中。在第一次启动时,将该文件复制到documents文件夹,并将其分配到持久存储。这种方法会更快,而且您不必担心合并失败

你能解释一下“将其分配给持久存储”是什么意思吗。我不明白你的建议有什么不同。