новый дочерний объект в Core Data создает ″ призрак ″ родитель? - PullRequest
0 голосов
/ 03 марта 2012

У меня есть родительский объект Notebook с отношением «ко-многим» к объекту Page.У меня есть прокрутка, отображающая все мои объекты Notebook с их обложками, и у меня есть модальный переход с контроллером представления, чтобы добавить новый объект Notebook через кнопку навигации.Когда я использую кнопку «Сохранить» в этом контроллере add-notebook-view, все идет хорошо, и я обнаруживаю себя с новой записной книжкой вместе с другими в моем просмотре прокрутки.

Теперь я попытался добавить первую страницу записной книжки, вызвавэтот метод в методе действия кнопки сохранения:

- (void) addFirstPage {
    Page *newPage = (Page *)[NSEntityDescription insertNewObjectForEntityForName:@"Page" inManagedObjectContext:self.managedObjectContext]; 
    NSNumber *number = [NSNumber numberWithInt:1];
    newPage.pageNumber = number;
    newPage.toNotebook = aNewNotebook;
    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *indexFileURL = [bundle URLForResource:@"index" withExtension:@"html"];
    newPage.page123andABC = [NSString stringWithContentsOfURL:indexFileURL usedEncoding:Nil error:Nil]; 
    NSError *error;
    if (![self.managedObjectContext save:&error])
        NSLog(@"Failed to add the first page: %@", [error domain]);
}

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

A) добавляет обложку моего Блокнота, как обычно, как последний блокнот в списке (они упорядоченыатрибут даты создания).

B) В начале представления прокрутки у меня пустое место, как будто у меня там есть вторая записная книжка.Если я добавляю несколько записных книжек, в начале прокрутки появляется столько пустых пространств, сколько записных книжек.

Я пытался удалить записную книжку, назначенную странице, перед тем, как назначить свою собственную (aNewNotebook), если она была создана автоматически., но это дает мне ошибку, которую я пытаюсь удалить ноль.

Таким образом, создается впечатление, что я добавляю две записные книжки (одна без набора creationDate - в соответствии с тем, что появляется в начале scrollView, и что я действительно устанавливаю свою creationDate только для aNewNotebook; вторая - для NewNotebook;).Но, похоже, у меня есть только один, потому что, если я пытаюсь удалить ненужный, он говорит, что он не существует.

Пожалуйста, помогите - он будет очень признателен: -)

ОБНОВЛЕНИЕ:

Я попытался добавить два объекта страницы одновременно в свой метод addFirstPage, и я последовательно обнаружил два новых пустых пространства для ноутбука в моем scrollview.

Кроме того, я использовал NSLog для вывода счетчиказаписные книжки сразу после того, как я добавляю одну страницу, и я получаю 2 записные книжки - одну, которую я только что добавил, и одну, которая автоматически добавляется при добавлении нового объекта страницы.Таким образом, количество записных книжек соответствует тому, что я вижу в scrollView.

Есть мысли?

ВРЕМЕННОЕ РЕШЕНИЕ, КОТОРОЕ НАХОДИТСЯ КАК ХАК:

в моем методе addFirstPage - послеЯ создаю страницу и перед сохранением я добавил этот код, чтобы удалить единственную записную книжку без creationDate - то есть записную книжку, автоматически созданную путем добавления новой страницы:

 NSMutableArray *notebooksToDelete = [CoreDataHelper searchObjectsForEntity:@"Notebook" withPredicate:[NSPredicate predicateWithFormat:@"creationDate == %@", nil] andSortKey:@"creationDate" andSortAscending:YES andContext:managedObjectContext];

Notebook *toDelete = [notebooksToDelete objectAtIndex:0];

[managedObjectContext deleteObject:toDelete];

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

Ответы [ 2 ]

1 голос
/ 21 мая 2012

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

0 голосов
/ 03 марта 2012

Единственное логическое объяснение из того, что было раскрыто до сих пор, заключается в том, что в вашем представлении прокрутки вы должны ссылаться на объекты Page в некоторой точке для вычисления содержимого представления прокрутки, а не на объекты Notebook. Быстрый текстовый поиск в исходном файле контроллера представления покажет виновника.

Убедитесь, что вы записали количество страниц в указанной записной книжке перед выходом из контроллера создания записной книжки. Также убедитесь, что вы вообще не используете сущность Page в контроллере представления прокрутки.

...