如何更新核心数据并维护用户保存的数据?

时间:2014-11-15 09:57:59

标签: sqlite core-data user-input updates

我在App Store上有一个使用Core Data的应用程序,我想进行更新。我使用预加载的sqlite文件来创建persistentStore。模型中有两个实体,其中一个实体保存用户保存的数据。

我的问题:我想用新的预加载的sqlite更新现有的核心数据,但保留用户保存的数据。有没有办法将预加载文件的新数据与用户保存的数据合并?

模型保持不变;我没有添加任何新的实体或属性,所以我认为迁移是不合适的(我可能是错的)。

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

   NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CreatureData.sqlite"];

   if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {
      NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CreatureData" ofType:@"sqlite"]];
      NSLog(@"JUST LOADED COREDATA SQLITE");
      NSError* err = nil;

      if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) {
         NSLog(@"Oops, couldn't copy preloaded data");
      }
   } else {
      NSLog(@"Core Data SQLITE already exists");
   }


   NSError *error = nil;
   _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
   if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
       //abort();
   }

return _persistentStoreCoordinator;
}

编辑:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CreatureData.sqlite"];
NSURL *secondStoreURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CreatureData" ofType:@"sqlite"]];

if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {
      NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CreatureData" ofType:@"sqlite"]];
      NSLog(@"JUST LOADED COREDATA SQLITE");
      NSError* err = nil;

      if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) {
         NSLog(@"Oops, couldn't copy preloaded data");
      }
   }

   NSError *error = nil;
   _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

   NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : @YES,
                             NSInferMappingModelAutomaticallyOption : @YES };

   if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"UserSavedData" URL:storeURL options:options error:&error]) {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   }
   if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"StaticTableData" URL:secondStoreURL options:options error:&error]) {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   }

1 个答案:

答案 0 :(得分:0)

Apple建议您将静态和用户数据分开,在这种情况下分为2个持久存储。您可以执行以下操作之一:

首选且可取的选项是,您为用户数据使用单独的商店。您需要更新数据模型以容纳两个商店,因此它将是轻量级迁移。

然后,您将从现有的sqlite存储中首次启动时提取用户数据,并将它们存储到新的动态存储中。然后,您可以删除旧的sqlite商店。

第二个选项是保持当前设置。首次运行时,使用其他名称​​复制新文件,然后从旧商店中提取用户数据并将其复制到新商店。然后删除旧商店。