2010-07-14 3 views
0

Либо я не понимаю, что означает термин «uniquing» в Core Data, либо я неправильно получаю данные. У меня довольно простая модель данных. Три объекта: Сообщество, Активы и Категория. Каждое Сообщество имеет отношение к нескольким категориям. Каждая категория имеет отношение к нескольким активам. Каждый создаваемый актив должен иметь одну и только одну категорию.iPhone SDK: Основные данные и уникальность?

В коде, который я опубликовал, я хотел бы вывести все категории, которые имеет конкретное сообщество в консоли. Я думал, что из-за уникальных возможностей 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

Это еще что-то изменило. Где люди получают это? – TechZen

+0

Что касается mutableCopy, это необходимо, потому что я использую NSMutableArray для результатов выборки. Я думаю, мне не нужно, чтобы он был изменчив, хотя ... –

ответ

1

Uniquing означает, что каждый объект в графе объектов сам по себе является уникальным. Это не означает, что атрибуты любых двух объектов не идентичны. Uniquing - это отношение не атрибутов. Нет двух объектов, которые могут занимать то же самое положение в графе объектов.

Что касается того, почему вы получаете несколько категорий на выходе: Самое простое объяснение состоит в том, что communityInstance.categories - это отношение ко многим. (Так как у него есть множественное имя, и вы назначаете его для установки.) В отношении «ко многим» контекст не заставляет отдельный объект на другом конце отношения.

+0

Спасибо. Я об этом поступил совершенно по-другому. –