从特定部分删除核心数据对象

我有一个很奇怪的问题,但如果我能解释得好,我想答案不会那么难。 这是我目前的情况:

我有一个tableView有六个固定的部分。

这些部分填充了核心数据对象。

我正在使用一个瞬态属性来决定哪个部分的对象必须显示。 此过程在NSManagedObject子类中完成。 瞬态属性称为sectionIdentifier

由于使用瞬态属性来决定每个对象应该出现哪个部分,所以我决定在每个部分创build一个特殊的行,意图是每个部分总是至less有一行。 这个选项将会减less问题,使得在添加或删除行的时候,会有一个nil节会引发exception,至less在testing应用程序的时候这个问题有时候会成为问题。

这意味着在第一次发射时,每一节都有一行(我将称之为特殊行)。 然后用户可以完美地添加/删除行。

我现在的问题是,如果该部分有新的行,我需要删除这个特殊的行。 同时,如果用户删除了该部分的最后一行,应用程序将自动创build一个新的特殊行,所以该部分永远不会为空。

我知道这不是pipe理它的最好方法,但是由于我的iOS知识,这是我发现在从空白部分添加或删除行时避免exception的最佳方法。

我需要的是当用户添加至less一个新的行到部分删除从一个部分的特殊行。

该对象具有名为quitar的string属性,以及特殊的行: 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使用transient属性,并且可以在我的代码中看到,所有特殊的行都被删除了,而不仅仅是特定的部分。 我需要你的帮助,find一种方法来删除我想要的部分中的特殊行,而不是从所有部分删除。

谢谢你,我的英语很抱歉。

EDITED

请在NSManagedObjectToDoItem分配sectionIdentifier的方式下面find:

 -(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; } 

我已经检查了在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]; };