0

我有下表,我想获取文件大小字段数据的总和,其中 isSelectedForSync标志将为YES。

这是 DigitalLibrary 表属性

表名:数字图书馆

属性及其类型:

  • 数字图书馆 ID (NSNumber)
  • 文件名(NSString)
  • 连接类型(NSString)
  • 文件大小(NSNumber - doubleValue)
  • isSelectedForSync (NSNumber - BOOL)
  • isSync (NSNumber - BOOL)

我想获取 isSelectedForSync 标志为YES的文件计数。还需要获取 isSelectedForSync 的 fileSize 的总和

我正在尝试低于 NSExpression,但没有得到我想要的。它也给了我错误。

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"DigitalLibrary" inManagedObjectContext:self.managedObjectContext];

    NSDictionary *entityDict = [entityDescription propertiesByName];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isSync == %@ && isSelectedForSync == %@",[NSNumber numberWithBool:NO], [NSNumber numberWithBool:YES]];

    [fetchRequest setPredicate:predicate];
    [fetchRequest setEntity:entityDescription];
    [fetchRequest setResultType:NSDictionaryResultType];
    [fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:[entityDict objectForKey:@"connectType"], nil]];

    //AllPhotoCount
    NSExpression *countExpression = [NSExpression expressionForFunction:@"count:"
                                                              arguments:@[[NSExpression expressionForKeyPath:@"connectType"]]];
    NSExpressionDescription *fileCountExpressionDescription = [[NSExpressionDescription alloc] init];
    [fileCountExpressionDescription setName:@"filesCount"]; // Choose an appropriate name here!
    [fileCountExpressionDescription setExpression:countExpression];
    [fileCountExpressionDescription setExpressionResultType:NSInteger32AttributeType];
//    //Selected Photo Count
    NSExpression *selectedFileExpression = [NSExpression expressionForFunction:@"sum:"
                                                                      arguments:@[[NSExpression expressionForKeyPath:@"isSelectedForSync"]]];
    NSExpressionDescription *selectedFilesExpressionDescription = [[NSExpressionDescription alloc] init];
    [selectedFilesExpressionDescription setName:@"selectionCount"]; // Choose an appropriate name here!
    [selectedFilesExpressionDescription setExpression:selectedFileExpression];
    [selectedFilesExpressionDescription setExpressionResultType:NSInteger32AttributeType];

NSString *shadowVar = @"";
    //Sum Of FileSize which file selected
//    NSExpression *keyPathSelectedFileSizeTotalExpression = [NSExpression expressionForKeyPath:@"fileSize"];
    NSExpression *selectedFileSizeTotalExpression = [NSExpression expressionForFunction:@"sum:"
                                                                              arguments:@[[NSExpression expressionForKeyPath:@"fileSize"]]];

    NSExpression *totalselectedFileSizeExpression = [NSExpression expressionForSubquery:selectedFileSizeTotalExpression usingIteratorVariable:shadowVar predicate:[NSPredicate predicateWithFormat:@"isSelectedForSync == %@",[NSNumber numberWithBool:YES]]];

    NSExpressionDescription *selectedFileSizeTotalExpressionDescription = [[NSExpressionDescription alloc] init];
    [selectedFileSizeTotalExpressionDescription setName:@"selectedFileSizeTotal"];
    [selectedFileSizeTotalExpressionDescription setExpression:totalselectedFileSizeExpression];
    [selectedFileSizeTotalExpressionDescription setExpressionResultType:NSInteger64AttributeType];

 [fetchRequest setPropertiesToFetch:@[[entityDict objectForKey:@"connectType"], fileCountExpressionDescription, selectedFileSizeTotalExpressionDescription]];

    NSLog(@"2nd shadowVar:%@",shadowVar);

    NSError* error = nil;
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

如果我删除'selectedFileSizeTotalExpressionDescription',上面的代码工作得很好,但需要如上所述的selectedFileSizeTotalExpressionDescription。

我对如何使用 NSExpression expressionForSubquery 方法感到非常困惑。

以下是包含在 DigitalLibrary 表中的数据:

+-----------+--------------------+--------------+------------+
|fileSize   |isSelectedForSync   |connectType   |fileName    |
+-----------+--------------------+--------------+------------+
|1000       |0                   |Image         |temp1.png   |
+-----------+--------------------+--------------+------------+
|200        |1                   |Image         |tmp.png     |
+-----------+--------------------+--------------+------------+
|400        |1                   |Image         |tmp23.png   |
+-----------+--------------------+--------------+------------+
|20000      |1                   |Video         |test.mp4    |
+-----------+--------------------+--------------+------------+
|3000       |1                   |Audio         |temp2.mp3   |
+-----------+--------------------+--------------+------------+
|15000      |0                   |Video         |test12.mp4  |
+-----------+--------------------+--------------+------------+
|3500       |0                   |Audio         |temp12.mp3  |
+-----------+--------------------+--------------+------------+

我想要以下结果:

+----------------+-------------------+--------------+----------------+------------------+
|TotalFileSize   |selectedFileSize   |connectType   |totalFileCount  |selectedFileCount |
+----------------+-------------------+--------------+----------------+------------------+
|1400            |600                |Image         |3               |2                 |
+----------------+-------------------+--------------+----------------+------------------+
|35000           |20000              |Video         |2               |1                 |
+----------------+-------------------+--------------+----------------+------------------+
|6500            |3000               |Audio         |2               |1                 |
+----------------+-------------------+--------------+----------------+------------------+
4

1 回答 1

0
  NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([DigitalLibrary class])];//
    NSPredicate * imageTypePredicate = [NSPredicate predicateWithFormat:@"connectType ==[c] Image"];

    [fetchRequest setPredicate:imageTypePredicate];

    NSArray * imageTypeFilteredArray = [context executeFetchRequest:fetchRequest error:nil];

    NSArray * imageFileSizeArray = [imageTypeFilteredArray valueForKey:@"fileSize"];

    double totalValue = 0.0;

    for (NSNumber * eachFileSize in imageFileSizeArray)
    {
        totalValue += [eachFileSize doubleValue];
    }

    NSPredicate * predicate = [NSPredicate predicateWithFormat:@"isSelectedForSync == YES"];
    NSArray * selectedImageFileSizeArray = [imageTypeFilteredArray filteredArrayUsingPredicate:predicate];


    double totalSelectedValue = 0.0;

    for (NSNumber * eachFileSize in selectedImageFileSizeArray)
    {
        totalSelectedValue += [eachFileSize doubleValue];
    }

Similarly can do for video and audio.

于 2014-12-15T11:48:06.760 回答