0

我完全重写了我之前由 3rd 方开发的应用程序。他们为 CoreData 使用了 Magical Record,我在模拟器上的 /Library/Application Support/AppName/ 文件夹中找到了他们的 appname.sqlite 文件。

我仍在学习 CoreData 并使用 Xcode 中的 CoreData 应用程序模板,我的 sqlite 位于 /Documents/ 文件夹中。有人可以建议打开旧商店的代码以便我执行迁移吗?谢谢你。

原始代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [MagicalRecordHelpers setupCoreDataStack];
    .....
    return YES;
}

魔法记录:

+ (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
}
4

1 回答 1

1

方法 1:将现有的核心数据模型复制/移动到您的新 XCode 项目中(您似乎又从头开始了)。选择模型,然后选择 Editor-->New Version。再次单击模型,然后在右侧菜单中选择新模型版本。对数据模型进行所需的细微更改。该应用程序应该为您自动升级数据模型。

方法 2:将现有的核心数据模型复制/移动到新的 XCode 项目中。编写一个快速解析,获取先前模型中的所有对象,并在新模型中创建它们。确保不要混用 MOC。

方法 3 (Insanity.gif):如果您无法访问以前版本的源代码……您将度过一段糟糕的时光。可以对核心数据 sqlite 文件进行逆向工程,但要知道 Apple 可能随时更改其工作方式。如果您查看表格,您会看到表格Z[name-of-object]等...一对一关系很容易通过表格中的列来理解,例如等。一对一/多对多将有一个表格,例如。与数据库中所有对象相比,与第一个对象的字母顺序相关的数字。是的。是每个表的主键,在所有关系映射中用作参考。是调试多对多关系的指南,特别是ZFOOZBARZ[relationship-name]ZMANAGERZADDRESSZ_[number-from-metadata-for-obj1][name-of-obj-2]Z_3ADDRESSZ_PKZ_PrimaryKeyZ_ENT柱子。

祝你好运

于 2013-09-17T13:46:33.400 回答