Новый дочерний объект в Core Data создает ″ призрак ″ родитель?
У меня есть родительский объект 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). В этот момент, если я нажму кнопку "Сохранить" в модальном представлении, мне будет представлен вид прокрутки, который:
А) добавил обложку моего Блокнота, как обычно, как последний блокнот в списке (они упорядочены по атрибуту даты создания).
Б) В начале просмотра прокрутки у меня пустое место, как будто у меня есть вторая тетрадь. Если я добавлю несколько записных книжек, в начале прокрутки будет столько же пустых пространств, сколько и в записных книжках.
Я пытался удалить записную книжку, назначенную странице, перед тем, как назначить свою собственную (aNewNotebook) на тот случай, если она была создана автоматически, но выдает ошибку, что я пытаюсь удалить ноль.
Таким образом, это похоже на то, что я добавляю две записные книжки (одна без набора creationDate в соответствии с тем, что появляется в начале scrollView, и что на самом деле я устанавливаю для своей creationDate только aNewNotebook; вторая - aNewNotebook). Но, похоже, у меня есть только один, потому что, если я пытаюсь удалить ненужный, он говорит, что его не существует.
Пожалуйста, помогите - это будет очень оценено:-)
ОБНОВИТЬ:
Я попытался добавить два объекта страницы одновременно в своем методе 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 ответа
Я столкнулся с той же проблемой и обнаружил, что проблема была вызвана объявлением родительской сущности для моей дочерней сущности в модели данных. Как только я удалил родительскую сущность, проблема ушла.
Единственное логическое объяснение из того, что было раскрыто до сих пор, заключается в том, что в представлении прокрутки вы должны ссылаться на Page
объекты в какой-то момент для расчета содержимого представления прокрутки, а не Notebook
объекты. Быстрый текстовый поиск в исходном файле контроллера представления покажет виновника.
Убедитесь, что вы записали количество страниц в указанной записной книжке перед выходом из контроллера создания записной книжки. Также убедитесь, что вы не используете Page
сущность в вашем контроллере представления прокрутки вообще.