我有两个关系如下的实体:
Contact <--> ContactMeta
在这里,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;
我们可以在核心数据中做类似的事情,还是有任何智能和更好的方法来实现我想要做的事情?
请建议。
答案 0 :(得分: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];