iPhone SDK:核心数据和唯一性?

时间:2010-07-14 20:44:06

标签: iphone core-data

要么我不理解核心数据中“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);

当我执行此操作时,我在控制台中获得了重复的名称。为什么呢?

1 个答案:

答案 0 :(得分:1)

Uniquing意味着对象图中的每个对象本身都是唯一的。这并不意味着任何两个对象的属性不相同。 Uniquing是关系而不是属性。没有两个对象可以占据对象图中完全相同的位置。

至于为什么你在输出中得到多个类别:最简单的解释是communityInstance.categories是一个多对多的关系。 (因为它具有复数名称并将其分配给set。)在to-many关系中,上下文不会强制关系另一端的单个对象。