3

Appleのドキュメントには、(自動)軽量移行を設定するための次の例が示されています。

NSError *error = nil;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

BOOL success = [psc addPersistentStoreWithType:<#Store type#>
                    configuration:<#Configuration or nil#> URL:storeURL
                    options:options error:&error];
if (!success) {
    // Handle the error.
}

ただし、私はRestKitを使用しています。これは、舞台裏で永続ストアの作成を処理します。初期化コードの簡略化されたバージョンは次のようになります。

// Initialize RestKit
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:rootURL];

// Create the object store
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:databaseName                 
                                                                 usingSeedDatabaseName:seedDatabaseName 
                                                                    managedObjectModel:nil //Don't need to pass it in. It is infered  
                                                                          delegate:self];
// Create Mappings
...

// Define Relationships
...

// Set Mappings
...

RestKitが舞台裏でpersistantStoreを作成する場合、構成オプションをどこに渡す必要がありますか?

4

2 に答える 2

2

RKManagedObjectStore.mこれらのオプションは、createPersistentStoreCoordinatorメソッドで追加できます。

RestKit のバージョン 0.10 の場合、既に追加されています。最新バージョンかどうかはわかりません。ただし、まだ追加されていない場合は、自分自身を追加できます。メソッドの最終的な外観は次のようになります。

- (void)createPersistentStoreCoordinator
{
    NSAssert(_managedObjectModel, @"Cannot create persistent store coordinator without a managed object model");
    NSAssert(!_persistentStoreCoordinator, @"Cannot create persistent store coordinator: one already exists.");
    NSURL *storeURL = [NSURL fileURLWithPath:self.pathToStoreFile];

    NSError *error;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_managedObjectModel];

    // Allow inferred migration from the original version of the application.
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        if (self.delegate != nil && [self.delegate respondsToSelector:@selector(managedObjectStore:didFailToCreatePersistentStoreCoordinatorWithError:)]) {
            [self.delegate managedObjectStore:self didFailToCreatePersistentStoreCoordinatorWithError:error];
        } else {
            NSAssert(NO, @"Managed object store failed to create persistent store coordinator: %@", error);
        }
    }
}

3 つの新しいエンティティを追加し、古いエンティティの名前を変更して、プロジェクトでこれをテストしましたが、デバイスから以前のアプリを削除することなく完全に機能しています。これがお役に立てば幸いです。

于 2013-05-31T12:27:19.893 に答える
2

私の理解では、RestKit は Core Data の上にあります。そのため、シードされたデータベースを使用していて、RestKit にオブジェクト マネージャーのオブジェクト ストアを割り当てさせる場合でも、Core Data によって提供される sqlite データベースが使用されます。

RestKit で軽量移行を有効にするには、AppDelegate でメソッドを使用できます- (NSPersistentStoreCoordinator *)persistentStoreCoordinator(このスレッドを参照)

AppDelegate

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil) return __persistentStoreCoordinator;

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"thenameofyoursqlite.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Auto migration failed, error %@, %@", error, error.userInfo);
        abort();
    }
}
于 2012-07-31T20:01:11.550 に答える