10

MagicalRecordを使用するアプリがあり、参照用に使用される大量のデータをデータベースに事前入力しています。同じデータモデル内に、ユーザーがアプリで実行できることに関するユーザー定義可能な情報があります。

事前入力されたデータは「バックアップしない」とマークされているはずなので、アプリは拒否されました。そのため、ユーザーデータをバックアップ可能として保持できるように、そのデータを別のデータストアに保存したいと思います。

MagicalRecordを使用して2つの別々のデータストアを持つ方法はありますか?

4

3 に答える 3

15

可能だとは思いますが、簡単ではありません。ご存知のように、複数のデータベースを操作するには、 にいくつかの変更を加える必要があるPersistentStoreCoordinatorため、2 つのPersistentStores. この後、Core Data スタックは次のようになります。 ここに画像の説明を入力

もう 1 つの方法は、2 つの個別の PersistentStoreCoordinator を作成し、それぞれが 1 つのストアを保持することです。

Magical Record では、 NSPersistentStoreCoordinator+MagicalRecord.hにストアを追加するためのクラス メソッドがいくつかあります 。

  • (NSPersistentStore *) MR_addInMemoryStore;
  • (NSPersistentStore *) MR_addAutoMigratingSqliteStoreNamed:(NSString *) storeFileName;
  • (NSPersistentStore *) MR_addSqliteStoreNamed:(id)storeFileName withOptions:(__autorelease NSDictionary *)options;

やりたいことができる場所だと思います。

また、スタックをセットアップするプロセス全体がMagicalRecord+Setup.hにあることにも言及する必要があります。

+ (void) setupCoreDataStackWithStoreNamed:(NSString *)storeName

そのため、ストアとコーディネーターをそこに追加できます。私は自分でそれを管理したことはありません。これは、可能な解決策の簡単な調査にすぎません。

于 2012-06-20T19:11:32.190 に答える
6

構成を使用してこの問題を解決できました。Magical Record は常にnull構成パラメーターを送信するため、バラバラsetupCoreDataStackWithAutoMigratingSqliteStoreNamedにして、複数の構成をサポートするメソッドに置き換えました。

Magical Record は自動移行を適切に処理するため、最初に を呼び出しsetupCoreDataStackWithAutoMigratingSqliteStoreNamed、次にクリーンアップを実行してから、代わりのコードを提供します。

「シード」構成に割り当てられたシード データ オブジェクトと「ユーザー」構成に割り当てられたユーザー オブジェクトを持つ 1 つのオブジェクト モデルがあります。Magical Record は既に初期化されているため、必要に応じて自動移行できます。

+(void) RB_setupMultipleStores:(NSString *) seedStoreName userStore:(NSString *) userStoreName
/* change persistent store to one with multiple configurations. Assumes Magical Record is initialized. */
{
NSError * error= nil;

[MagicalRecord cleanUp];

NSManagedObjectModel * model = [NSManagedObjectModel MR_defaultManagedObjectModel];

NSURL *seedURL = [NSPersistentStore MR_urlForStoreName:[seedStoreName stringByAppendingString:@".sqlite"]];

NSPersistentStoreCoordinator * coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

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

NSPersistentStore * seedStore =[coordinator
                                  addPersistentStoreWithType:NSSQLiteStoreType
                                  configuration:@"Seed"
                                  URL:seedURL
                                  options:options
                                  error:&error];
if (!seedStore || error)
{
    NSLog(@"Error setting up seed store:%@ for %@", [error localizedDescription], seedURL);
    exit(-1);
}

NSURL *userURL = [NSPersistentStore MR_urlForStoreName:[userStoreName stringByAppendingString:@".sqlite"]];

NSPersistentStore * userStore = [coordinator
                                 addPersistentStoreWithType:NSSQLiteStoreType
                                 configuration:@"User"
                                 URL:userURL
                                 options:options
                                 error:&error];

if (!userStore || error)
{
    NSLog(@"Error setting up user store:%@ for %@", [error localizedDescription], userURL);
    exit (-1);
}
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];

[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}

また、MR 3.0 には並行スタックがあり、一度完了すると問題が解決する可能性があります。

于 2014-06-03T19:04:51.710 に答える