Файл открытия основных данных загрязнен, непоследовательно пропущены значения, выборка возвращает пустой массив - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть приложение на основе документа, работающее с основными данными.Объектная модель имеет три объекта с несколькими свойствами.Кажется, все работает в основном нормально - я могу заполнить некоторую информацию и сохранить ее, без проблем.Однако когда я открываю полученный файл, он всегда открывается «грязно», прежде чем я что-то коснулся, и некоторые поля иногда остаются пустыми.

Я имею в виду, что иногда вы открываете файл, и эти поля отображаются пустыми, а в другой раз вы открываете файл, и они отображаются с правильными данными.Пустые свойства связаны только с одним из объектов и отображаются в том же NSTabView.Некоторые из них NSStrings отображаются в виде значений в текстовых полях и надписях.

Обновление: Благодаря совету @ ughoavgfhw я переключился на хранилище XML и обнаружил две проблемы:создание нового объекта каждый раз, когда документ открывается в [MyDocument init] вместо загрузки сохраненного в постоянном хранилище, но теперь у меня возникают проблемы с извлечением этого.

В полученном XML-файле послесохранить, он включает в себя это (сущность и свойства, которые доставляют мне проблемы):

<object type="STORY" id="z102">
    <attribute name="title" type="string">test 6</attribute>
    <attribute name="descript" type="string">this is a test</attribute>
</object>

, и я пытаюсь получить его с этим:

- (Story *)getSavedStory {
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Story" inManagedObjectContext:[self managedObjectContext]];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:entityDescription];
    NSError *error = nil;
    NSArray *array = [[self managedObjectContext] executeFetchRequest:request error:&error];
    if (array == nil) {
        NSLog(@"%@",error);
        return nil;
    } else {
        return [array lastObject];
    }
}

После открытия этого постоянного хранилищаэтот запрос возвращает пустой массив (и без ошибок).Любые советы о том, куда идти отсюда?

1 Ответ

2 голосов
/ 17 декабря 2010

Без кода я могу только догадываться, но я полагаю, что вы выполняете некоторые настройки при загрузке документа. Вы не отключаете отмену регистрации, поэтому помечаете ее как «грязную». Есть несколько причин, по которым данные не могли быть загружены правильно. Две наиболее вероятные ситуации: а) вы перезаписываете данные во время инициализации, или б) данные не сохраняются правильно и, следовательно, не могут быть загружены правильно.

Вот как отключить регистрацию отмены:

NSManagedObjectContext *moc; //In your document subclass, get this with [self managedObjectContext];
[moc processPendingChanges];
[[moc undoManager] disableUndoRegistration];
//Make changes here
[moc processPendingChanges];
[[moc undoManager] enableUndoRegistration];

Обновление для новой информации: Не вносите никаких изменений в основные данные в методе init. WindowControllerDidLoadNib: метод является лучшим выбором, потому что все было загружено в этот момент. Вот пример, который проверяет существующую сущность Story и создает новую, если необходимо:

- (void)windowControllerDidLoadNib:(NSWindowController *)windowController {
    [super windowControllerDidLoadNib:windowController];
    NSFetchRequest *req = [[NSFetchRequest alloc] init];
    [req setEntity:[NSEntityDescription entityForName:@"Story" inManagedObjectContext:[self managedObjectContext]]];
    NSError *err = nil;
    NSArray *objs = [[self managedObjectContext] executeFetchRequest:req error:&err];
    [req release];
    if(!objs) {
        [[NSAlert alertWithError:err] runModal];
        return;
    }
    NSManagedObject *story = nil;
    if([objs count] == 0) {
        [[self managedObjectContext] processPendingChanges];
        [[self undoManager] disableUndoRegistration];
        story = [NSEntityDescription insertNewObjectForEntityForName:@"Story" inManagedObjectContext:[self managedObjectContext]];
        //Additional setup
        [[self managedObjectContext] processPendingChanges];
        [[self undoManager] disableUndoRegistration];
    } else story = [objs lastObject];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...