0

おもちゃの iOS プロジェクトでは、MagicalRecord を使用して、アプリケーション デリゲートで CoreData スタックをセットアップしています。次のコードを使用します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [MagicalRecord setupCoreDataStackWithStoreNamed:@"ToyProject.sqlite"];
  [[NSManagedObjectContext MR_defaultContext] setUndoManager:[[NSUndoManager alloc] init]];

...
}

私が書いている NSManagedObject のサブクラスがあり (NSRailsManagedObject - 私は NSRails をフォークし、CoreData サポートを追加しました)、それに saveContext メソッドを与えました:

- (void)saveContext {
  dispatch_async(dispatch_get_main_queue(), ^{
    @try {
        NSError *error = nil;
        if (![self.managedObjectContext save:&error]) {
          NSLog(@"Failed to save core data: %@", [error localizedDescription]);
        } else {
          NSLog(@"\"Successfully\" saved your data.");
        }
    }
    @catch (NSException *exception) {
      NSLog(@"Couldn't save your data! Try again later :(");
    }
    @finally {
      NSLog(@"Look, I don't know what else to tell you, mang.");
    }
  });
}

このメソッドを使用してこのクラスのサブクラスを保存しようとすると、エラーは発生せず、表向きは保存に成功します。ただし、アプリケーションの次の実行時には、前回の実行で存在していたデータは存在しません。代わりに、saveContext メソッドに次のコードが含まれている場合、問題なく動作します。

- (void)saveContext {
  [[NSManagedObjectContext MR_defaultContext] MR_save];
}

さらに、2 つをハイブリッド化すると、保存してもデータが保持されません。

- (void)saveContext {
  dispatch_async(dispatch_get_main_queue(), ^{
    @try {
        NSError *error = nil;
        if (![[NSManagedObjectContext MR_defaultContext] save:&error]) {
          NSLog(@"Failed to save core data: %@", [error localizedDescription]);
        } else {
          NSLog(@"\"Successfully\" saved your data.");
        }
    }
    @catch (NSException *exception) {
      NSLog(@"Couldn't save your data! Try again later :(");
    }
    @finally {
      NSLog(@"Look, I don't know what else to tell you, mang.");
    }
  });
}

他に何を試すべきか本当にわかりません。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

1

まあ、私は MagicalRecord を使用したことはありませんが、あなたの問題がそれと関係があるとは思えません. 残念ながら、あなたは正しい情報を提供していませんでした。

具体的には、管理対象オブジェクトのコンテキストは何ですか? つまり、self.managedObjectContext は何を返し、そのコンテキストはどのように作成されるのでしょうか?

デフォルトの MR コンテキストとの関係は? MR はスレッド固有のコンテキスト マッピングを行うと思うので、MR を使用する場合は、MR を使用する必要があります。

基本的に同じ文脈なら自分でいいのですが、違う場合は他の人たちと調整する必要があります。また、子として作成した場合、子コンテキストの保存は変更を親にプッシュするだけで、保存はしないことに注意してください。

また、MOC が nil でないことを確認してください... nil MOC は、save: メッセージ (またはその件に関する任意のメッセージ) を送信しただけで何もしません。

于 2012-05-24T22:01:33.430 に答える
1

MagicalRecord は、rootSavingContext と呼ばれる別の (ほとんどがプライベートな) コンテキスト内にネストされた defaultContext を作成します。その結果、ネストされた (子) コンテキストで Core Data の標準の -save メソッドを呼び出すと、ディスクに書き込まれ、その変更が親の rootSavingContext に反映されるだけです。

基本的に、次の 2 つの選択肢があると思います。

  1. MR_save を呼び出して、MagicalRecord に処理させます。すなわち:

    [[NSManagedObjectContext MR_defaultContext] MR_save];
    
  2. defaultContext で NSManagedObjectContext save を呼び出し、親コンテキストで save を呼び出してフォローアップします。

    [[NSManagedObjectContext MR_defaultContext] save];
    [[NSManagedObjectContext MR_rootSavingContext] save];
    
于 2012-08-17T19:34:57.040 に答える