使用 Core Data + RestKit 0 自动删除并重新创建持久数据存储。2.x
Automatically drop and re-create Persistent Data Store with Core Data + RestKit 0.2.x
虽然在使用 Core Data
和 RestKit
开发我的应用程序的早期阶段,我经常大量修改数据模型,但发现很少或根本没有考虑迁移的用处。
我希望逻辑是:
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 应用程序时通常的开发设置:
- 在每个 运行 上设置一个标志来擦除商店。
- 在
persistentStoreCoordinator
方法中,如果设置了标志,则在调用 addPersistentStore...
之前删除存储文件。
- 添加一个
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 中找到此方法。
虽然在使用 Core Data
和 RestKit
开发我的应用程序的早期阶段,我经常大量修改数据模型,但发现很少或根本没有考虑迁移的用处。
我希望逻辑是:
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 应用程序时通常的开发设置:
- 在每个 运行 上设置一个标志来擦除商店。
- 在
persistentStoreCoordinator
方法中,如果设置了标志,则在调用addPersistentStore...
之前删除存储文件。 - 添加一个
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 中找到此方法。