У меня есть очень простая установка с использованием основных данных: один NSManagedObjectContext
и два NSFetchedResultsController
с. Приложение имеет собственный подкласс NSManagedObject
.
То, что я делаю, более или менее следующее (псевдокод / поток):
1. create an NSFetchRequest
-> with it an NSFetchedResultsController
(and attach an NSFetchedResultsControllerDelegate)
2. fetch the objects from the store
3. create another NSFetchRequest (in/from/with the same context)
-> with it a second NSFetchedResultsController
4. fetch a subset of objects
5. change an object via
[[[secondFetchedResultsController fetchedObjects] objectAtIndex:0]
setWhateverSyncedProperty:differentValue]
6. save the NSManagedObjectContext (-> no error)
7. restart app -> changes lost
То, что я прочитал в документации, это то, что a) первый делегат FetchedResultsController должен получить событие controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
и b) NSManagedObjectContext сохранил изменения в постоянном хранилище. Ничего из этого не происходит.
Я бы также ожидал, что NSManagedObjectContext
"увидит" изменения непосредственно перед сохранением, то есть вернет YES
, когда я вызову "hasChanges" для него. Это не. Вероятно, это также является причиной того, что ничего не сохраняется в постоянном хранилище: он думает, что изменений нет.
Как ни странно, когда я "NSLog" Содержимое контекста, я вижу измененный объект. Итак, изменения в памяти ...
Последнее, но не менее важное: при звонке
[[self managedObjectContext] refreshObject:[[[self fetchedResultsController] fetchedObjects] objectAtIndex:2] mergeChanges:YES];
делегат получает сообщение didChangeObject
!
У меня есть ощущение, что это может быть связано с "Примечаниями, относящимися к значению ключа" в hasChanges в NSManagedObjectContext Reference Class , но я не понимаю, думаю.
Любые идеи и / или подсказки приветствуются.
Кстати: я на симуляторе iPhone и на XCode 3.2.5.