将float属性添加到核心Data中的实体,并在每次添加新Object时递增它

时间:2012-11-06 06:55:20

标签: ios ios5 core-data

我是coreData的新手,我正在研究一个示例应用程序,其中我将名为displayOrder的float类型属性添加到名为“Test”的实体中。我想在添加每个测试对象时增加此显示顺序。为此,我写了下面的代码,但它没有用,我想知道我哪里出错了

- (void)insertNewObject:(NSString *)fileName
{    
    Test *testName = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.managedObjectContext];

    [testName setName:fileName];

    NSManagedObject *lastObject = [self.controller.fetchedObjects lastObject];
    float lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] floatValue];
    NSLog(@"%f",lastObjectDisplayOrder);
    [testName setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"];

    // Save the context.
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

实际上,问题是它第一次增加,即从0增加到1,但在此之后我总是1。

此致 兰吉特

2 个答案:

答案 0 :(得分:0)

您的问题可能与加载lastObject的部分有关,您可能无法更新fetchedresultscontroller,我建议创建一个iVar并在init或viewDidLoad上分配值,然后使用该iVar更新并获取正确的值另外,如果你没有使用小数,你只需要订单也许整数应该更好。

答案 1 :(得分:0)

您可以使用Core Data Aggregate Functions获取最大的displayOrder值。

类似的东西:

- (NSNumber *)nextDisplayOrder {
    NSManagedObjectContext *context = self.managedObjectContext;

    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Test" inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];
    [request setResultType:NSDictionaryResultType];

    NSExpression *keyExpression = [NSExpression expressionForKeyPath:@"displayOrder"];
    NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:keyExpression]];

    NSExpressionDescription *description = [[NSExpressionDescription alloc] init];
    [description setName:@"maxDisplayOrder"];
    [description setExpression:maxExpression];
    [description setExpressionResultType:NSFloatAttributeType];

    [request setPropertiesToFetch:[NSArray arrayWithObject:description]];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    if (results.count == 1) {
        NSNumber *maxDisplayOrder = [[results objectAtIndex:0] valueForKey:@"displayOrder"];
        return [NSNumber numberWithFloat:[maxDisplayOrder floatValue] + 1.f];
    } else {
        NSLog(@"Could not get next displayOrder. Error: %@", error);
    }

    return nil;
}

一些补充说明: