要么我不理解核心数据中“uniquing”这个术语的含义,要么我没有正确地获取我的数据。我有一个非常简单的数据模型。三个实体:社区,资产和类别。每个社区都与多个类别有关系。每个类别都与多个资产有关系。创建的每个资产必须只有一个类别。
在我发布的代码中,我想将特定社区的所有类别输出到控制台中。我认为,由于Core Data的唯一功能,一次只能存在一个同名的类别(名称是类别的唯一属性)。但是,当我打印到控制台时,我得到了重复的类别名称。
// Fetch Community instances in the database, and add them to an NSMutableArray
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *community = [NSEntityDescription entityForName:@"Community" inManagedObjectContext:managedObjectContext];
[request setEntity:community];
// Only return the community instances that have the cityName of the cell tapped in the CommunitiesNonEditableTableViewController
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(cityName like %@)", cellCityName];
[request setPredicate:predicate];
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
// Set communitiesArray with mutableFetchResults
[self setCommunitiesArray:mutableFetchResults];
[mutableFetchResults release];
[request release];
// Creates a community instance using the community stored in the array at index 0. This is the only community in the array.
Community *communityInstance;
communityInstance = [communitiesArray objectAtIndex:0];
// Retrieves existing categories of assets in the community, and adds them to an NSSet
NSSet *communityCategoriesSet = communityInstance.categories;
// Converts NSSet to an NSArray with each category as an index
NSArray *communityCategoriesArray = [communityCategoriesSet allObjects];
// For loop that iterates through the array full of categories, retrieves the names of each category, and adds it to an NSMutableArray
categoryNames = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < [communityCategoriesArray count]; i++) {
Category *categoryInstance;
categoryInstance = [communityCategoriesArray objectAtIndex:i];
[categoryNames addObject:categoryInstance.name];
}
// Prints array full of category names to console
NSLog(@"%@", categoryNames);
当我执行此操作时,我在控制台中获得了重复的名称。为什么呢?
答案 0 :(得分:1)
Uniquing意味着对象图中的每个对象本身都是唯一的。这并不意味着任何两个对象的属性不相同。 Uniquing是关系而不是属性。没有两个对象可以占据对象图中完全相同的位置。
至于为什么你在输出中得到多个类别:最简单的解释是communityInstance.categories
是一个多对多的关系。 (因为它具有复数名称并将其分配给set。)在to-many关系中,上下文不会强制关系另一端的单个对象。