0

コア データベースを使用して、サムネイルの写真画像とユーザーが選択した評価を保存する IOS アプリがあります。これには、複数の管理対象オブジェクト コンテキストを使用します。

問題は、アプリを初めてインストールして起動したとき (そして新しいデータベースを作成したとき) に、メインの MOC が、写真の評価に変更を加えている一時的な MOC からの更新を認識しないことです。ただし、その後のアプリの起動 (つまり、データベースが既に存在する) では、毎回すべてが正常に機能します。

さらに、新しいアプリの起動時に、評価がメインのビューコントローラーに表示されなくても、アプリの再起動時にユーザーが入力した評価が表示されるため、評価がディスクに保存されていることがわかります。

メインの MOC は、写真を表示するリスト ビュー コントローラーです。ユーザーがリストから写真を選択すると、ユーザーが写真の評価を選択する別のビュー コントローラー (同じ永続ストアに関連付けられた一時的な MOC を使用) が起動します。ただし、アプリを新たに起動すると、写真の評価設定がリスト ビュー コントローラーに反映されることはありません。

私はいくつかのコードを含めました。洞察をいただければ幸いです。

メインリストビューコントローラーでのデータベース作成

if ([fileManager fileExistsAtPath:[urlForPhotosDb path]]) {

if (photosDB.documentState == UIDocumentStateClosed) {
   [photosDB openWithCompletionHandler:^(BOOL success) {

        ......(additional code here).........

}];     
}
} else {
[photosDB saveToURL:urlForPhotosDb forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
[PhotosDatabase populatePhotosDb];

......(additional code here).........
];
}

return photosDB;
}

On View Load in main listView コントローラ

(void)viewDidLoad
{
[super viewDidLoad];


[PhotosDatabase getPhotosDbForOpenBlock:^(UIManagedDocument  *doc) {
self.psc = [doc.managedObjectContext persistentStoreCoordinator];
[self setupFetchedResultsController:doc];
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(contextSaved:)
                                      name:NSManagedObjectContextDidSaveNotification
                                      object:nil];
}];
}

メインのデリゲートメソッドでの一時的なMOCの設定

セカンダリ ビュー コントローラーから呼び出されたリストビュー コントローラー

-(void)didSelectPhotoRating:(NSDictionary *)photoInfo Rating:(NSNumber *)rating
{
NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] init];
[newContext setPersistentStoreCoordinator:self.psc];
Photos *photo = [Photos findPhoto:photoInfo
           inManagedObjectContext:newContext];
if (photo) {
photo.rating = rating;
NSError *error;
[newContext save:&error];
}

}

変更をマージするためのメイン リストビュー コントローラのメソッド

-(void)contextSaved:(NSNotification *)notification
{
if ([notification object] != self.document.managedObjectContext) {
    [self.document.managedObjectContext

mergeChangesFromContextDidSaveNotification:notification];
[self performFetch];
[self.tableView reloadData];
}
}

上記の contextSaved メソッドでは、通知にはユーザーが選択した写真の評価が実際に含まれています。しかし、メインのリストビューコントローラーには反映されません。

4

1 に答える 1

0

ネストされたコンテキストの使用を開始します。それははるかに簡単で、あらゆるレベルで同期しています。現時点では、コア データ プログラミング ガイドを十分にカバーするように更新していません。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

于 2013-01-25T03:42:32.280 に答える