1

1. 2 つのビューから同じ Core Data コンテキストを使用する最良の方法は何ですか?

2 つの ViewController を持つ TabBarController があります。最初に、保存する必要がある時間を記録したいと思います。2 番目には、すべてのレコードを表示する TableView があります。チュートリアルで言われたとおりに実行し、App Delegate ですべての ManagedDataContext を開始して、コントローラーに渡します。

- (void)applicationDidFinishLaunching:(UIApplication *)application {

   SecondViewController *tableController = [[SecondViewController alloc] init];
   tableController.managedObjectContext = [self managedObjectContext];

   self.navigationController = [[UINavigationController alloc] initWithRootViewController:tableController];

   [window addSubview: [self.navigationController view]];
   [window makeKeyAndVisible];
}

しかし、この変数を(同じクラスでも)複数回使用すると、(ある種のnullpointer)エラーが発生します。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Event''

デバッグ中に、ここの managedObjectContext が null であることがわかりました。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];

ここで何が問題なのですか?ビューへの最適なソリューションは何ですか?

シングルトンを使用することは可能ですか?

- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        NSLog(@"managedObjectContext already in use. Returning instance.");
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }

    NSLog(@"managedObjectContext nil. Returning new instance.");
    return managedObjectContext;
}

2. データモデルとは異なるオブジェクトを格納できますか?

私のクラスに含まれる他のオブジェクトを保存しないようにする必要があります。保存したくない配列のように。これは可能ですか?

4

1 に答える 1

2

1. tabbarcontroller を使用しています。そのタブ バーの viewControllers には、プロパティ (managedObjectContext など) が必要です。ストーリーボードまたは nib を介して tabbarcontroller を使用している場合は、tabbarcontroller の viewControllers プロパティを介して viewControllers にアクセスし、managedObjectContext を設定できます。

UITabBarController * tabBarController = (UITabBarController *) self.window.rootViewController;

// the first tab is a navcontroller, which contains as a rootVC a custom VC with a property for the MOC
UINavigationController          * navController = (UINavigationController *)[tabBarController.viewControllers objectAtIndex:0]; 
MyViewController1  * rootVCOfNavController          = (MyViewController1 *)     [[historyNavigationController viewControllers] objectAtIndex: 0];

// the second tab of the tabbarcontroller is a custom VC with a MOC property
MyViewController2   * viewController2  = (MyViewController2 *)[tabBarController.viewControllers objectAtIndex:1];

viewController1 = self.managedObjectContext;
rootVCOfNavController.managedObjectContext = self.managedObjectContext;

これにより、最初の「裸の」viewController が MOC を取得し、NavigationController に埋め込まれていることが確認されます。これにより、最初のエラーが処理されます。これには、viewController 階層をよく理解する必要があります (注: viewController 階層は、view-hierarchy と同じではありません)。

この場合、シングルトンを使用することは、完全には理解していない問題の回避策になるため、お勧めできません。シングルトンが完璧な場合もありますが、今のところ appDelegate はその役割を十分に果たすことができます。

2. ここで何を言っているのかよくわかりません。データ モデルで定義されていないオブジェクトは、コア データに格納できません。ただし、オブジェクトを別のモデル (独自のコア データ スタックを持つ) に保存することはできます。または、他の方法で永続化します。しかし、私はあなたが何か他のことを意味していると思います。保存する必要のないいくつかの managedOjects 'クラス' があることを意味すると仮定すると、2 番目の MOC を作成することができ、保存することはありません。元の MOC の子として設定することもできます。その場合、元の mod の永続ストアに存在するすべてのデータが取得されますが、新しいオブジェクトは子 MOC にのみ存在します。子 MOC を保存すると、新しいオブジェクトが元の MOC に移動し、その MOC を保存するとそれらがディスクに永続化されます。繰り返しますが、2番目の質問であなたが何を意味するのか正確にはわかりません。

于 2013-09-07T15:28:53.243 に答える