0

在开发我的应用程序的早期阶段,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它只是把它炸毁吗?

如果没有,我错过了这个阻止上述算法实现的操作的复杂性?

4

1 回答 1

1

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

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

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

虽然这与您的“蛮力”方法相对应,但我发现它对于快速开发周期来说是最简单和最有效的。此外,与“不那么野蛮”的迁移过程相比,我看不出有任何缺点,除非您的应用内生成的数据对开发非常重要,这往往很少见。

顺便说一句,如果您需要生成种子数据,或者如果您想对具有大量记录的系统进行压力测试,数据填充器可以非常方便地使用。

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

- (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 中找到此方法。

于 2015-04-26T20:40:26.323 回答