4

我在 Core Data 中有一个很大的对象列表(大约 50 000 并且定期增加)。我通过以下请求获取它:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:[SongObject name]];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
fetchRequest.propertiesToFetch = @[@"uid", @"name", @"toArtistRef.uid", @"toArtistRef.name"];
fetchRequest.resultType = NSDictionaryResultType;

实体 SongObject 也包含toSongsInPlaylistRef对多的关系。

我需要为每个对象获取这个集合的计数。由于数据量大,我无法获取关系本身。我尝试添加 @"toSongsInPlaylistRef.@count"@"toSongsInPlaylistRef.count" 但它崩溃了

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'Invalid to many relationship in setPropertiesToFetch: (toSongsInPlaylistRef.count)'

请写下任何建议。

4

2 回答 2

6

要获取相关对象的计数,您必须创建一个NSExpressionDescription 并将其包含在propertiesToFetch

NSExpression *countExpression = [NSExpression expressionForFunction:@"count:"
        arguments:@[[NSExpression expressionForKeyPath:@"toSongsInPlaylistRef"]]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"playListCount"]; // Choose an appropriate name here!
[expressionDescription setExpression:countExpression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];

fetchRequest.propertiesToFetch = @[expressionDescription, ...];
于 2013-10-05T20:36:44.543 回答
1

如果您不想获取所有歌曲,但想获取它们的计数,也许您应该添加一个新的属性计数,随着您添加新歌曲,您会增加

于 2013-10-03T14:35:59.087 回答