Базовое приложение на основе документов: как моделировать и управлять сущностью, которая создается только один раз для каждого документа? - PullRequest
0 голосов
/ 20 ноября 2010

У меня есть несколько вопросов, на которые я пытался ответить для себя (просматривая документацию), но у меня есть ощущение, что я что-то упустил.

Будем весьма благодарны за любые подсказки (и / или ссылки на соответствующую документацию).

Я создаю приложение на основе документов Core Data. Существуют две сущности:

С каждым документом связана одна запись «Сравнение». С каждым документом потенциально связано много записей «Узлов».

Мой первый вопрос: правильно ли я думаю об этом? Поскольку для каждого документа существует только один объект сравнения, атрибуты сравнения по сути являются атрибутами самого документа. Какой (если таковой имеется) является предпочтительным способом моделирования этого?

Если сущность Сравнения действительно является правильным способом, мой следующий вопрос - как и когда на самом деле создать (единственный) объект Сравнения. Пользователю не нужно явно «добавлять» Сравнение, поскольку с документом будет связан только один из них. Вместо этого следует создать экземпляр объекта Comparison и вставить его в managedObjectContext. У меня уже есть что-то вроде этого, с кодом в MyDocument.m, который выглядит так:

  • (void) windowControllerDidLoadNib: (NSWindowController *) windowController { [super windowControllerDidLoadNib: windowController]; [NSEntityDescription insertNewObjectForEntityForName: @ "Сравнение" inManagedObjectContext: managedObjectContext]; }

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

Ответы [ 4 ]

1 голос
/ 31 января 2013

Я нашел эту ветку, борясь с точно такой же проблемой. У меня есть таблица Entity_A, работающая в приложении Core Data, основанном на документе, но мне нужно выяснить, как обрабатывать необходимый отдельный экземпляр для каждого документа Entity_B.

Я нашел что-то, что, кажется, работает. Возможно, есть лучший способ, но сейчас я преодолеваю это препятствие.

Когда загружается xib документа, я просто проверяю, был ли создан объект Entity_B. если нет, я создаю его и инициализирую его атрибуты.

    - (void)windowControllerDidLoadNib:(NSWindowController *)aController
    {
        [super windowControllerDidLoadNib:aController];

        //has an Entity_B been created?  if not, create one.
        NSError *theError = nil;
        NSUInteger count = [[self managedObjectContext] countForFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Entity_B"] error:&theError];

        if( count == 0 )
        {
            NSManagedObject *newEntity_B = [NSEntityDescription insertNewObjectForEntityForName:@"Entity_B" inManagedObjectContext:[self managedObjectContext]];

            [newEntity_B setValue:[NSNumber numberWithBool:YES] forKey:@"boolAttribute"];
            [newEntity_B setValue:[NSNumber numberWithInt:2] forKey:@"intAttribute"];
        }
    }
0 голосов
/ 20 ноября 2010

Ваш вопрос о моделировании не очень ясен, не могли бы вы уточнить, что ваша сущность "Сравнение" должна делать и какие атрибуты вы ей назначаете? Было бы удобно увидеть структуру вашего объекта «Документ», чтобы мы могли предоставить некоторые полезные данные.

Что касается вашего второго вопроса, вы можете проверить, был ли обновлен ваш NSManagedObject, прежде чем принимать решение о том, предлагать ли пользователю сохранить свой документ или нет:

if ([documentObject isUpdated]) {
...
}

Подробнее в документации здесь http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html#//apple_ref/occ/cl/NSManagedObject

Ура, Рог

0 голосов
/ 20 ноября 2010

На самом деле сущности «Документ» не существует, я просто использовал этот термин для обозначения всего документа, который сохраняется, когда пользователь вызывает пункт меню «Сохранить». Возможно, есть лучший способ обратиться к этой концепции? NSPersistentDocument

Резервное копирование ... центральной идеей приложения является сравнение двух иерархических структур каталогов (визуально-рекурсивный "diff").

На данный момент сущность «Сравнение» имеет два строковых атрибута, pathA и pathB, которые являются именами двух каталогов, которые нужно сравнить. Каждый объект «Узел» представляет имя файла в сравниваемых деревьях каталогов. Сущность Node содержит по крайней мере один атрибут ("lativePath "), который является путем относительно начальной точки, указанной в Сравнении.

Мой первый вопрос был просто: имеет ли смысл иметь сущность «Сравнение», поскольку будет создан только один из них (в некоторый момент после того, как пользователь вызовет пункт меню «Новый»).

Второй вопрос на самом деле в какой момент должен создаваться экземпляр единого объекта «Сравнение» и вставляться в managedObjectContext, т. Е. Какой метод наиболее подходит для этого?

Наконец, если объект «Сравнение» автоматически создается (во время awakeFromNib, может быть?), Но пользователь решает не продолжать, и просто нажимает кнопку закрытия, ему не нужно предлагать сохранить (верно?) Что будет подходящий способ сделать это? Похоже, что documentObject обновлен, поскольку «пустой» объект сравнения фактически уже был вставлен автоматически при запуске, но пользователь не изменил его.

Надеюсь, это понятно ... спасибо.

0 голосов
/ 20 ноября 2010

Я не вставил этот фрагмент кода в исходное сообщение правильно.Попытка еще раз:

-(void)windowControllerDidLoadNib:(NSWindowController *)windowController {
   [super windowControllerDidLoadNib:windowController];
   [NSEntityDescription insertNewObjectForEntityForName:@"Comparison" inManagedObjectContext:managedObjectContext];
}
...