NSArrayController и Core Data не работают должным образом - PullRequest
0 голосов
/ 10 мая 2011

У меня есть окно со списком, полным объектов Core Data, и окно отображения, которое открывается при выборе одного из них.

Определенное действие в окне дисплея помечает объекты базовых данных как «Чтение».

Чтобы открыть объект, я передаю объект в окно отображения, а также sortDescriptors и filterPredicate, которые отображают список, поэтому окно отображения может перемещаться вперед / назад (в главном окне иногда отображается подмножество объектов, которое почему мне нужны sortDescriptors и filterPredicate).

Маркировка открытого объекта как прочитанного работает отлично. Он обновляется в главном окне автоматически благодаря KVO.

Однако, когда я перемещаюсь вперед / назад к другому объекту в окне дисплея, маркировка как прочитанная больше не работает. Я просматриваю код и вижу выполнение кода, проверяю новое значение, и оно помечается как прочитанное, но это не отражается ни в главном окне, ни в базе данных.

Есть ли что-нибудь очевидное, что может быть причиной этого? Я ни в коем случае не создаю копию основного объекта данных. Окно отображения использует NSArrayController для извлечения данных, и к нему применяются sortDescriptors и filterPredicate. Мой код для получения следующего объекта выглядит так:

-(MyObject *object)nextObject {

    // _object is the object being displayed by the display window.
    // _listContainingObject is an NSArrayController set to Entity: Object

    NSArray *list = [_listContainingObject arrangedObjects];

    NSUInteger positionInList = 0;
    for (MyObject *object in list) {

        if ([[[object objectID] URIRepresentation] isEqualTo: [[_object objectID] URIRepresentation]]) {            break;
        }
        positionInList++;
    }

    if (positionInList == [list count] - 1) return nil;

    if (positionInList + 1 > [list count] - 1) return nil;

    MyObject *object = [list objectAtIndex: positionInList + 1];

    return object;    

}

Мне действительно кажется, что я сталкиваюсь с некоторыми скрытыми особенностями Core Data, например, объекты, извлеченные из другого NSArrayController, являются копиями ... но все работает на том же ManagedObjectContext. Контекст управляемого объекта NSArrayController связан со свойством моего делегата приложения, который возвращает тот же контекст, что и все остальные. Я довольно сильно почесал голову от этого.

1 Ответ

2 голосов
/ 19 мая 2011

помните, что когда вы работаете с элементами, ваш managedObjectContext действует как блокнот. Ваши изменения в ваших управляемых объектах не будут отражены в базе данных, пока вы фактически не сохраните контекст управляемого объекта.

Поэтому после того, как вы пометили элемент как прочитанный или непрочитанный, вам нужно сохранить контекст.

NSError *saveContextError=nil;
if (![yourManagedObjectContext save:&saveContextError){
    // Handle the error
    NSLog(@"managedObjectContext save error:  %@",error);
}
...