核心数据:在获取时重命名属性

Dev*_*shi 1 cocoa-touch core-data nsfetchrequest

我有两个关系如下的实体:

Contact <--> ContactMeta
Run Code Online (Sandbox Code Playgroud)

在这里,Contact有一个关系为'contactMeta',ContactMeta有一个属性为'operation'.

我在Contact实体上触发了一个fetchRequest.结果类型是NSDictionaryResultType.

所以我得到了一个字典数组,我使用NSJSONSerialization进行序列化并将其作为JSON请求发送到服务器.

现在,我将"contactMeta.operation"添加到propertiesToFetch列表中,因此字典中的一个键是"contactMeta.operation".

问题是 -我需要在JSON请求中发送"operation"作为密钥,代替"contactMeta.operation".

我有一个选项 - 迭代列表中的每个字典,添加一个键 - "操作",其值为键"contactMeta.operation"的值,然后删除"contactMeta.operation"的键值.

但我对这种方法不满意,并且认为在sqlite中我们可以有这样的查询:

Select first_name, last_name, contactmeta as operation from contact;
Run Code Online (Sandbox Code Playgroud)

我们可以在核心数据中做类似的事情,还是有任何智能和更好的方法来实现我想要做的事情?

请建议.

Mar*_*ski 5

你的预感是正确的,还有另一种方式.您正在寻找NSExpressionDescription.

    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
    [request setResultType:NSDictionaryResultType];
    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"contactmeta"];
    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
    [expressionDescription setName:@"operation"];
    [expressionDescription setExpression:keyPathExpression];
    [expressionDescription setExpressionResultType:NSUndefinedAttributeType];
    [request setPropertiesToFetch:@[@"first_name",@"last_name",expressionDescription]];
    NSError* error = nil;
    NSArray* rez = [context executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)