0

我知道已经对此进行了多次讨论,但没有一个解决了我的简单问题。

我有一个名为 Character 的实体,里面有 4 列:character_id、episode_id、title、desc

可以有多个相同的 character_ids 值,但具有不同的 episode_id。

当我执行 fetch\select 时,我对整个表执行此操作,并希望通过 character_id 清楚地获取它。所以这就是我所做的:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName    inManagedObjectContext:moc];
[fetchRequest setEntity:entity];

// Add a sort descriptor. Mandatory.
if(sortDescriptors != nil) {
    [fetchRequest setSortDescriptors:sortDescriptors];
}

fetchRequest.predicate = predicate;

// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work.
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates.
// Since you only want distinct names, only ask for the 'name' property.
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"title"]];
fetchRequest.returnsDistinctResults = YES;


NSArray *fetchResults = [moc executeFetchRequest:fetchRequest error:&error];

'fetchResults' 数组包含 10 行中的 3 行,这是正确的结果!

问题:数组中的任何对象都不可访问。

如果我尝试以下操作:

NSDictionary item1 = [fetchResults objectAtIndex:0];
NSString *title = [item1 objectForKey:@title"];

我得到一个例外!

我究竟做错了什么??如何将字典翻译回 NSManagedObjects?

谢谢!

4

1 回答 1

2

首先,在使用 Core Data 时,您不应该使用外键。相反,最好使用 Core Data 的关系,让框架以不透明的方式处理 id。也许您正在与 Web 服务同步并且需要跟踪 id,但您的程序逻辑实际上不应该依赖它。

其次,如果你需要一个对象,使用 确实比NSManagedObjectResultType使用NSDictionaryResultType. 您仍然可以获得不同的结果。如果您没有遇到性能问题,这是首选模式。代码也更具可读性。

您的数据结构将是这样的,具有多对多关系:

Character <<--->> Episode

一个情节的所有角色或具有某个角色的所有情节都是简单的。这些将是由数据模型的逻辑决定的“不同”结果:

NSArray *allCharactersInEpisode = episode.characters;
NSArray *allEpisodesWithCharacter = character.episodes;

要选择所有剧集的所有角色,您只需选择所有角色。比“不同”查询简单得多。

于 2013-10-19T09:59:52.057 回答