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

时间:2014-01-27 04:12:43

标签: ios uitableview core-data

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

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

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

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

由于使用transient属性决定每个对象应出现在哪个部分的原因,我决定在每个部分上创建一个特殊行,目的是每个部分总是至少有一行。此选项将减少问题,使得在添加或删除行时会抛出异常的nil部分,至少在测试应用程序时这是一个问题。

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

我现在遇到的问题是,如果该部分有新行,我需要删除此特殊行。同时,如果用户删除该部分中的最后一行,该应用程序会自动创建一个新的特殊行,因此该部分永远不会为空。

我知道这不是管理它的最佳方式,但由于我的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

请在下面找到我在NSManagedObjectToDoItem中指定sectionIdentifier的方式:

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

}

1 个答案:

答案 0 :(得分: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];



             };