2015-04-13 1 views
0

У меня есть следующие моделиданных с определенной каскадного удаления, но если удалить строку из объекта Record в представлении таблицы соответствующий записи в Объект Puls не удаляются. Я не могу понять, почему.Xcode каскадное ядро ​​удаления данных не работает в режиме таблицы

enter image description here

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 

     [tableView beginUpdates]; 
     // Delete the row from the data source 

     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

     [self.managedObjectContext deleteObject:[self.fetchedRecordsArray objectAtIndex:indexPath.row]]; 

     NSError *error; 
     if (![self.managedObjectContext save:&error]) { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
     } 

     tpAppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
     self.fetchedRecordsArray = [appDelegate getAllRecords]; 

     [tableView endUpdates]; 
    } 
} 


-(void)viewDidLoad 
{ 
    tpAppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
    self.managedObjectContext = appDelegate.managedObjectContext; 

    // Fetching Records and saving it in "fetchedRecordsArray" object 
    self.fetchedRecordsArray = [[appDelegate getAllRecords]mutableCopy]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    tpAppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
    self.managedObjectContext = appDelegate.managedObjectContext; 

    self.fetchedRecordsArray = [[appDelegate getAllRecords]mutableCopy]; 
    [self.tableView reloadData]; 
} 
+0

Нет ошибки? Как вы тестируете объекты до и после удаления? – Wain

+0

Нет. У меня нет ошибок. Я использую приложение «iExplorer» для копирования папки «Документ» моего приложения с iPhone на мой MAC-адрес, и я открываю файл .sqlite с другим приложением «SQLPro для SQLite», где я могу видеть все данные. –

+0

Попробуйте запросить контекст, вы не должны действительно смотреть на основные файлы. Я не говорю, что что-то не так, но спросите SDK, не спрашивает ли он об этом в частном хранилище данных. – Wain

ответ

1

Вы должны зафиксировать изменения, сохраняя контекст управляемого объекта, если вы хотите, чтобы сохраняться. Помните, что если у вас есть сохранение управляемых объектов дочернего управляемого объекта, он будет распространять изменения только в контексте родительского управляемого объекта.

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instp/NSManagedObjectContext/deletedObjects https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instm/NSManagedObjectContext/save:

+0

Я думал, что с оператором сохранения я совершаю операцию db. (apple doc: save: попытка переноса несохраненных изменений зарегистрированным объектам в родительский магазин получателя.) –

+0

Если хранилище управляемых объектов является верхним хранилищем, оно будет сохраняться на вашем дне, в противном случае оно будет обновлять только хранилище объектов родительского менеджера , «Если родительский хранилище контекста является постоянным координатором хранилища, тогда изменения привязаны к внешнему хранилищу. Если родительский хранилище контекста является другим контекстом управляемого объекта, то сохраняйте: только обновляет управляемые объекты в этом родительском хранилище. Чтобы зафиксировать изменения внешнего сохранить, вы должны сохранить изменения в цепочке контекстов до и включите контекст, родитель которого является постоянным координатором магазина ». –

+0

Привет, Эрик, я добавил viewDidLoad и viewWillAppear в свой первоначальный вопрос, чтобы показать, как я настраиваю вещи. К сожалению, я не понимаю, что вы пишете мои знания об управляемом объекте. Не могли бы вы быть добрыми и показать мне, какой код я должен добавить в свой исходный код, чтобы позволить каскадному удалению огня? –

-1

Попробуйте принимать эту строку ...

[self.managedObjectContext deleteObject:[self.fetchedRecordsArray objectAtIndex:indexPath.row]]; 

Из вашего if заявления в методе tableView:commitEditingStyle.


На самом деле понял, что мой предыдущий совет выше не будет работать, так как вы должны проверить UITableViewCellEditingStyleDelete

Я подумаю об этом, но извинений не имеют ничего, чтобы предложить на данном этапе.

+0

Если я удалю это заявление, я получаю сообщение об ошибке: 2015-04-14 21: 48: 50.035 .... [671: 11860] *** Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Недействительное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (1), плюс или минус количество вставленных строк или удалено из этого раздела (0 вставлено, 1 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 выведено). –

+1

Извинения, я должен быть более ясным. См. Обновленный ответ. – andrewbuilder

Смежные вопросы