NSFetchedResultsController - фантомная строка - PullRequest
1 голос
/ 23 июля 2010

Просто столкнитесь с хитрой проблемой NSFetchedResultsController.

Следующий код отлично работает во всех случаях, КРОМЕ первой записи в базу данных Core Data, когда она сообщает о 2 строках!

id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];

Если я добавлю дополнительные записи, они будут указаны правильно. И если я удаляю обе эти 2 начальные строки, все работает нормально.

Есть предложения? Если это поможет, используя:

  -com.apple.CoreData.SQLDebug 1

Я вижу, что было 1 INSERT и 2 SELECT.

Кроме того, эта проблема, по-видимому, не возникает, если я уже посетил представление, содержащее код NSFetchedResultsController (т.е. перед выполнением INSERT).

====
ОБНОВЛЕНИЕ 1:
Интересно, поможет ли эта прогулка по коду ...
1. ViewController A запускает фоновую NSOperation, которая выполняет загрузку
2. По завершении он отправляет уведомление в AppDelegate
3. Когда AppDelegate получает это уведомление, он импортирует данные (выполняя проверку, чтобы убедиться, что они находятся в главном потоке, прежде чем делать это)

Вот соответствующий бит кода importerDidSave (откуда был взят этот метод):

- (void)importerDidSave:(NSNotification *)saveNotification {  
   NSLog(@"In importerDidSave...");  
   if ([NSThread isMainThread]) {  
     NSLog(@"... on Main Thread.");     
     NSLog(@"Number of NSFetchedResultsController rows BEFORE: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);  
     [self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];  
     NSLog(@"Number of NSFetchedResultsController rows AFTER: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);  

который выводит:

... on Main Thread.  
Number of NSFetchedResultsController rows BEFORE: 1  
Number of NSFetchedResultsController rows AFTER: 3

Ответы [ 2 ]

0 голосов
/ 24 июля 2010

Не полагайтесь на прямую отладку SQL. Использование SQL в Core Data настолько скрыто за объектами (он даже не использует SQL все время), что вы не можете определить состояние графа объектов, глядя на SQL.

Скорее всего, у вас есть два объекта в разделе, но один находится в памяти, а другой - в постоянном хранилище. Только постоянный объект будет очевиден в отладке SQL. Вы можете иметь тысячи объектов на графике и тысячи строк в разделе таблицы, но пока объекты не будут сохранены, они не будут отображаться в SQL. Более того, шаблон вставки и удаления SQL не будет напрямую отражать вставки и удаления графа объекта.

Короче говоря, отладка SQL довольно бесполезна для отладки Core Data, и вы должны игнорировать ее в подавляющем большинстве случаев.

Если контроллер извлеченных результатов сообщает о двух объектах в разделе, то в этом разделе есть два объекта. Откуда взялся дополнительный объект, я не могу сказать без дополнительной информации.

Проверка:

  1. Ваш ключ раздела, если есть. Если ваши разделы настроены неправильно, у вас будут строки, в которых вы их не ожидаете.
  2. Проверьте вашу вставку, чтобы увидеть, если вы дублируете вставки.

Вы можете подтвердить правильность FRC, вручную выполнив ту же выборку, которую использует сам, и посмотрев, что возвращается. Отсортируйте возврат по каждому ключу раздела, и вы увидите, сколько объектов появилось в разделе.

0 голосов
/ 23 июля 2010

Этот код правильный. Я бы посмотрел, как вы добавляете данные в магазин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...