1

私はcoreDataを初めて使用し、「Test」というエンティティにdisplayOrderというfloat型属性を追加したサンプルアプリケーションに取り組んでいます。各テスト オブジェクトを追加するたびに、この表示順序を増やしたいと考えています。これが起こるために、私は以下のコードを書きましたが、うまくいきません。どこが間違っているのか知りたいです

- (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になります。

よろしくランジット

4

2 に答える 2

0

問題は、lastObjectをロードする部分に関連している可能性があり、fetchedresultscontrollerを更新しない可能性があります。iVarを作成し、initまたはviewDidLoadに値を割り当ててから、そのiVarを使用して更新し、正しい値を取得することをお勧めします。これに小数を使用せず、順序のみが必要な場合は、整数の方が適している可能性があります。

于 2012-11-06T07:19:48.267 に答える
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;
}

いくつかの追加メモ:

  • displayOrder のような離散値には浮動小数点数ではなく整数を使用します
  • このボイラープレート コードはMagicalRecordを使用して 2 行で記述できるので、確認してみてください。
  • 集計関数の詳細
于 2012-11-06T08:26:50.843 に答える