使用 Core Data + RestKit 0 自动删除并重新创建持久数据存储。2.x

Automatically drop and re-create Persistent Data Store with Core Data + RestKit 0.2.x

虽然在使用 Core DataRestKit 开发我的应用程序的早期阶段,我经常大量修改数据模型,但发现很少或根本没有考虑迁移的用处。

我希望逻辑是:

IF (there is a foolproof, automatic migration path) THEN
   TRY { foolproof path; }
   CATCH { brute path; }
ELSE
   brute path;

brute path:

IF (SqlLiteDatabase exists) THEN
   DELETE IT;

CREATE SqlLiteDatabase;

我现在所拥有的,老实说我不明白...

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:[[RestKitClientConfigurator webServiceConfiguration] baseURL]]];

NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
objectManager.managedObjectStore = managedObjectStore;

[managedObjectStore createPersistentStoreCoordinator];
NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"CTISDB.sqlite"];
NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"];

NSDictionary *optionsDictionary =
[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                            forKey:NSMigratePersistentStoresAutomaticallyOption];

NSError *error;
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil error:&error];
NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

但基本上,我真正想知道的是 - 现在这不是一个足够普遍的问题(必须不断重置虚拟设备),有一种方法可以告诉 Core Data 只是炸毁它?

如果不是,我错过了什么阻止上述算法实现的操作的复杂性?

不知道这是否会影响 RestKit,但这是我在开发不断发展的 Core Data 应用程序时通常的开发设置:

  1. 在每个 运行 上设置一个标志来擦除商店。
  2. persistentStoreCoordinator 方法中,如果设置了标志,则在调用 addPersistentStore... 之前删除存储文件。
  3. 添加一个 DataPopulator class 方便地用导入的或随机生成的虚拟数据填充数据库,最好也基于一个标志。

一旦您准备好或想要测试之前在应用程序中创建的数据,只需更改标志即可。很方便。

虽然这符合您的 "brute force" 方法,但我发现它对于快速开发周期来说是最简单和最有效的。此外,与 "less brutish" 迁移过程相比,我看不出有任何缺点,除非您的应用内生成的数据对于开发非常重要,而这种情况往往很少见。

顺便说一句,如果您需要生成种子数据,或者如果您想要使用大量记录对系统进行压力测试,数据填充器可以在以后派上用场。

添加一些用于删除商店的代码:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
   if (_persistentStoreCoordinator != nil) {
      return _persistentStoreCoordinator;
   }
   _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
       initWithManagedObjectModel:[self managedObjectModel]];
   NSURL *storeURL = // get the store URL
   if (kWipeDB) {
        [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
   }
   // add persistent store
   return _persistentStoreCoordinator;
}

如果您使用 XCode 的标准核心数据模板,您会在 AppDelegate 中找到此方法。