我是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。
此致 兰吉特
答案 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;
}
一些补充说明: