我完全重写了之前由第三方开发的应用程序。他们使用Magical Record for CoreData,我将他们的appname.sqlite文件放在/ Library / Application Support / AppName /文件夹中的模拟器上。
我还在学习CoreData,并使用Xcode的CoreData应用程序模板,我的sqlite位于/ Documents /文件夹中。有人可以建议代码打开旧商店,以便我可以执行迁移吗?谢谢。
原始代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[MagicalRecordHelpers setupCoreDataStack];
.....
return YES;
}
MagicalRecord:
+ (void) setupCoreDataStack
{
NSManagedObjectContext *context = [NSManagedObjectContext MR_context];
[NSManagedObjectContext MR_setDefaultContext:context];
}
+ (void) MR_setDefaultContext:(NSManagedObjectContext *)moc
{
NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_defaultStoreCoordinator];
if ([MagicalRecordHelpers isICloudEnabled])
{
[defaultManageObjectContext_ MR_stopObservingiCloudChangesInCoordinator:coordinator];
}
MR_RETAIN(moc);
MR_RELEASE(defaultManageObjectContext_);
defaultManageObjectContext_ = moc;
if ([MagicalRecordHelpers isICloudEnabled])
{
[defaultManageObjectContext_ MR_observeiCloudChangesInCoordinator:coordinator];
}
}
+ (NSPersistentStoreCoordinator *) MR_defaultStoreCoordinator
{
if (defaultCoordinator_ == nil && [MagicalRecordHelpers shouldAutoCreateDefaultPersistentStoreCoordinator])
{
[self MR_setDefaultStoreCoordinator:[self MR_newPersistentStoreCoordinator]];
}
return defaultCoordinator_;
}
+ (NSPersistentStoreCoordinator *) MR_newPersistentStoreCoordinator
{
NSPersistentStoreCoordinator *coordinator = [self MR_coordinatorWithSqliteStoreNamed:[MagicalRecordHelpers defaultStoreName]];
MR_RETAIN(coordinator);
return coordinator;
}
+ (NSString *) defaultStoreName;
{
NSString *defaultName = [[[NSBundle mainBundle] infoDictionary] valueForKey:(id)kCFBundleNameKey];
if (defaultName == nil)
{
defaultName = kMagicalRecordDefaultStoreFileName;
}
if (![defaultName hasSuffix:@"sqlite"])
{
defaultName = [defaultName stringByAppendingPathExtension:@"sqlite"];
}
return defaultName;
}
编辑:
超越文件的代码:
- (void)migrateVersion1
{
NSURL *version1URL = [[[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"Bundlename/Bundlename.sqlite"];
NSManagedObjectModel *version1Model = [[NSManagedObjectModel alloc] initWithContentsOfURL:version1URL];
NSPersistentStoreCoordinator *version1PCS;
NSError *error = nil;
if (version1Model != nil) {
version1PCS = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:version1Model];
}
if (![version1PCS addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:version1URL options:nil error:&error]) {
// handle error
}
NSManagedObjectContext *version1Context;
if (version1PCS != nil) {
version1Context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[version1Context setPersistentStoreCoordinator:version1PCS];
}
// start parsing
}
答案 0 :(得分:1)
方法1: 将现有核心数据模型复制/移动到新的XCode项目中(您似乎再次从头开始)。选择模型,然后选择编辑器 - >新版本。再次单击模型,然后在右侧菜单中选择新的模型版本。对数据模型进行所需的次要更改。应用程序应该为您自动升级数据模型。
方法2: 将现有核心数据模型复制/移动到新的XCode项目中。编写一个快速解析来获取先前模型中的所有对象,并在新模型中创建它们。确保你不要混合你的MOC。
方法3(Insanity.gif):
如果您无法访问以前版本的源代码......那么您将度过一段美好时光。可以对核心数据sqlite文件进行反向工程,但要知道Apple可能随时改变它的工作方式。如果查看表格,您会看到Z[name-of-object]
表格ZFOO
,ZBAR
等等......通过表格中的列Z[relationship-name]
可以轻松了解一对一关系例如ZMANAGER
,ZADDRESS
等。一个/多对多会有一个表Z_[number-from-metadata-for-obj1][name-of-obj-2]
,例如Z_3ADDRESS
。与第一个对象的字母顺序相比较的数字与数据库中的所有对象相关。是啊。 Z_PK
是每个表的主键,并在所有关系映射中用作引用。 Z_PrimaryKey
是您调试To-many关系的指南,特别是Z_ENT
列。
祝你好运