2014-01-27 2 views
0

У меня очень странный вопрос, но если я могу это объяснить, я думаю, что ответ будет не таким сложным. Это мой текущий сценарий:Удаление объектов данных ядра из определенного раздела

У меня есть таблицаView с шестью фиксированными разделами.

Разделы заполнены основными объектами данных.

Я использую переходный атрибут, чтобы определить, в каком разделе должен отображаться объект. Эта процедура выполняется в подклассе NSManagedObject. Атрибут переходного процесса называется sectionIdentifier.

Из-за причины использования атрибута переходного процесса для определения того, какой раздел должен появляться каждый объект, я решил создать специальную строку в каждом разделе с намерением, чтобы в каждом разделе всегда было по крайней мере одна строка. Этот параметр уменьшит проблему, чтобы иметь нулевую секцию, которая будет генерировать исключения в случае добавления или удаления строк, по крайней мере, это иногда было проблемой при тестировании приложения.

Это означает, что при первом запуске каждая секция имеет одну строку (я буду называть ее специальной строкой). И тогда пользователь может добавлять/удалять строки отлично.

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

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

Мне нужно удалить специальную строку из раздела, когда пользователь добавил в раздел по крайней мере одну новую строку.

Объект имеет строковый атрибут quitar и для специальных строк: quitar = @"si". Таким образом, все специальные строки легко идентифицировать.

Я использую этот код, чтобы удалить специальную строку, если есть новые строки в разделе:

NSManagedObjectContext *context = self.managedObjectContext; 

NSEntityDescription *entity=[NSEntityDescription entityForName:@"ToDoItem" inManagedObjectContext:context]; 
NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
[fetch setEntity:entity]; 
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"quitar like 'si'"]; 
[fetch setPredicate:predicate]; 
NSError *fetchError; 
NSArray *fetchedData=[self.managedObjectContext executeFetchRequest:fetch error:&fetchError]; 
for (NSManagedObject *item in fetchedData){ 

       [context deleteObject:item]; 
      } 

мне сказали, что вы не можете использовать переходные атрибуты в NSPredicate, и вы можете увидеть в моем коде , что все специальные строки удаляются не только из специального раздела. Мне нужна ваша помощь, чтобы найти способ удалить только специальную строку из раздела, который я хочу, а не из всех разделов.

Спасибо и простите за мой английский.

EDITED

Здесь Вы можете найти пути Поручаю sectionIdentifier в NSManagedObject классе ToDoItem:

-(NSString *)sectionIdentifier{ 

    [self willAccessValueForKey:@"sectionIdentifier"]; 
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"]; 
    [self didAccessValueForKey:@"sectionIdentifier"]; 




    if (!tmp){ 


     NSCalendar *calendar = [NSCalendar currentCalendar]; 
     NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit); 

     NSDate *today = [NSDate date]; 
     NSDate *date = self.todoDueDate; 

     NSDateComponents *components = [[NSDateComponents alloc] init]; 
     [components setCalendar:calendar]; 
     [components setYear:2065]; 
     [components setMonth:11]; 
     [components setDay:12]; 

     NSDate *dateFuturoSomeday = [calendar dateFromComponents:components]; 

     NSCalendar *calendar1 = [NSCalendar currentCalendar]; 
     NSDateComponents *components1 = [[NSDateComponents alloc] init]; 
     [components1 setCalendar:calendar1]; 
     [components1 setYear:2065]; 
     [components1 setMonth:11]; 
     [components1 setDay:13]; 

     NSDate *dateFuturoCompleted = [calendar1 dateFromComponents:components1]; 




     NSDateComponents *date1Components = [calendar components:comps 
                 fromDate: today]; 
     NSDateComponents *date2Components = [calendar components:comps 
                 fromDate: date]; 
     NSDateComponents *date3Components = [calendar components:comps 
                 fromDate: dateFuturoSomeday]; 
     NSDateComponents *date4Components = [calendar components:comps 
                 fromDate: dateFuturoCompleted]; 


     today = [calendar dateFromComponents:date1Components]; 
     date = [calendar dateFromComponents:date2Components]; 
     dateFuturoSomeday = [calendar dateFromComponents:date3Components]; 
     dateFuturoCompleted = [calendar dateFromComponents:date4Components]; 



     NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit 
               fromDate:today toDate:date options:0].day; 
     // NSString *section; 
     if (daysAfterToday < 0) { 
      tmp = @"0"; 
     } else if (daysAfterToday == 0) { 
      tmp = @"1"; 
     } else if (daysAfterToday > 0 && daysAfterToday < 2) { 
      tmp = @"2"; 
     } 
     else if ([self.todoDueDate isEqualToDate:dateFuturoSomeday]){ 
      tmp = @"4"; 
     } 
     else if ([self.todoDueDate isEqualToDate:dateFuturoCompleted]){ 
      tmp = @"5"; 
     } 
     else { 
      tmp = @"3"; 
     } 






     [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"]; 

    } 


    return tmp; 

} 
+0

Как вы можете рассчитать свой «разделIdentifier», пожалуйста, поделитесь кодом? можете ли вы изменить свой «sectionIdentifier» на постоянство вместо переходного? –

+0

Я положу код для «sectionIdentifier», редактирующий мой вопрос. Я не знаю, хорошо ли изменить его на постоянное, я думаю, что должна быть причина для его сохранения ... – mvasco

+1

Когда вы используете свойство переходного процесса как «sectionNameKeyPath», все объекты в выборке должны быть повреждены и вычислить их раздел, чтобы FRC мог решить, к какому разделу они принадлежат ==> очень низкая производительность, если присутствует множество объектов. –

ответ

0

Я проверил, что в методе cellForRowAtIndexPath, я могу обнаружить значение из переходного атрибута sectionIdentifier. Это означает, что я могу использовать его для определения специального элемента строки, обновить значение другого атрибута и удалить его.

ToDoItem *todoitem = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

     NSString *sec = todoitem.sectionIdentifier; 
     NSString *quitar = todoitem.quitar; 


     if ([sec isEqualToString:@"1"] && [quitar isEqualToString:@"si" ] && (numObjectsSec1 > 1)){ 
      NSLog(@"DAS OBJEKT KANN GELÖSCHT WERDEN %@", todoitem.todoName); 

      NSManagedObjectContext *context = self.managedObjectContext; 
      [todoitem setValue:@"si se puede borrar" forKey:@"borrar" ]; 
      NSError *error = nil; 
      // Save the object to persistent store 
      if (![context save:&error]) { 


       [context deleteObject: todoitem]; 



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