0

以前にサードパーティによって開発されたアプリを完全に書き直しました。彼らは 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 プロジェクトにコピー/移動します (最初からやり直しているようです)。モデルを選択し、[エディタ] --> [新しいバージョン] を選択します。モデルをもう一度クリックし、右側のメニューで新しいモデル バージョンを選択します。データモデルに必要な小さな変更を加えます。アプリはデータモデルを自動アップグレードする必要があります。

方法 2: 既存のコア データ モデルを新しい XCode プロジェクトにコピー/移動します。以前のモデルのすべてのオブジェクトをフェッチするクイック パースを記述し、それらを新しいモデルに作成します。MOC を混在させないでください。

方法 3 (Insanity.gif): 以前のバージョンのソース コードにアクセスできない場合は、大変なことになります。コア データの sqlite ファイルをリバース エンジニアリングすることは可能ですが、Apple がいつでも動作方法を変更する可能性があることを知っておいてください。Z[name-of-object]テーブルを見ると、 tableなどが表示されます。1 対 1 の関係はZFOO、などのZBARテーブルの列を介して簡単に理解できます。データベース内のすべてのオブジェクトと比較した最初のオブジェクトのアルファベット順に関連する番号。うん。各テーブルの主キーであり、すべての関係マッピングで参照として使用されます。対多関係、具体的にはZ[relationship-name]ZMANAGERZADDRESSZ_[number-from-metadata-for-obj1][name-of-obj-2]Z_3ADDRESSZ_PKZ_PrimaryKeyZ_ENT桁。

幸運を

于 2013-09-17T13:46:33.400 に答える