2012-09-06 3 views
4

나는 이것을 post에 관한 몇 가지 연구를했다. 그러나 그 해결책은 전혀 없습니다. 제가 무슨 짓을했는지 설명하게하십시오 :NSOrderedSet에 코어 데이터를 추가하는 방법은 무엇입니까?

enter image description here

그것은 실제로 언급 한 게시물과 매우 유사합니다. 내보기 컨트롤러에서 Category.h

@class Category, Item; 

@interface Category : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSOrderedSet *items; 
@property (nonatomic, retain) Category *parentcategory; 
@property (nonatomic, retain) NSSet *subcategories; 

@end 

@interface Category (CoreDataGeneratedAccessors) 

- (void)insertObject:(Item *)value inItemsAtIndex:(NSUInteger)idx; 
- (void)removeObjectFromItemsAtIndex:(NSUInteger)idx; 
- (void)insertItems:(NSArray *)value atIndexes:(NSIndexSet *)indexes; 
- (void)removeItemsAtIndexes:(NSIndexSet *)indexes; 
- (void)replaceObjectInItemsAtIndex:(NSUInteger)idx withObject:(Item *)value; 
- (void)replaceItemsAtIndexes:(NSIndexSet *)indexes withItems:(NSArray *)values; 
- (void)addItemsObject:(Item *)value; 
- (void)removeItemsObject:(Item *)value; 
- (void)addItems:(NSOrderedSet *)values; 
- (void)removeItems:(NSOrderedSet *)values; 
- (void)addSubcategoriesObject:(Category *)value; 
- (void)removeSubcategoriesObject:(Category *)value; 
- (void)addSubcategories:(NSSet *)values; 
- (void)removeSubcategories:(NSSet *)values; 

@end 

, 나는 범주 중 하나를로드

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:kEntityCategory]; 
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor 
                sortDescriptorWithKey:kAttributeCategoryName ascending:YES 
                selector:@selector(localizedCaseInsensitiveCompare:)]]; 

NSError *error = nil; 
AppDelegate* appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; 

NSArray* data = [appDelegate.dataCenter.document.managedObjectContext executeFetchRequest:request error:&error]; 
if (data.count > 0) 
{ 
    self.category = [data objectAtIndex:0]; 
} 

내가 테스트 목적으로 탐색 표시 줄에 버튼이 있습니다. 클릭하면 첫 번째 항목이 복사되고 끝에 추가됩니다.

Item* item = [self.category.items objectAtIndex:0]; 

[self.category willChangeValueForKey:@"items"]; 
NSMutableOrderedSet *tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.category.items]; 
[tempSet addObject: item]; 
self.category.items = tempSet; 
[self.category didChangeValueForKey:@"items"]; 

문제는 항목에서 모든 데이터베이스에 추가되지 않습니다이다. (예를 들어, 테스트를했는데 항목 내용을 수정하면 데이터베이스에 전혀 문제가 없음을 증명합니다.) 그러나 항목이 데이터베이스에없는 이유는 알 수 없습니다. 아무도 도와 줄 수 있니? 감사합니다

+0

NSEntityDescription insertNewObjectForEntityForName을 사용하여 새 항목을 항목의 끝에 추가 할 수 있습니다. 카테고리에 항목 중간에 새 항목을 삽입 할 방법이 없기 때문에 문제가 해결되지 않습니다. –

답변

2

문제가 해결되었습니다. 두 가지 문제가 있습니다

  1. 이 삽입 할 수없는 경우는/내가 바보 같은 이름의 충돌이 기존 항목
  2. 를 추가합니다. 그래서 this post의 제안이 좋습니다.

감사합니다.

15

스위프트 :

let mutableItems = items.mutableCopy() as! NSMutableOrderedSet 
mutableItems.addObject(anItem) 
items = mutableItems.copy() as! NSOrderedSet 

오브젝티브 C :

NSMutableOrderedSet *mutableItems = (NSMutableOrderedSet *)items.mutableCopy; 
[mutableItems addObject:anItem]; 
items = (NSOrderedSet *)mutableItems.copy; 
+2

'mutableItems'는 "let"을 사용하는 상수가되는 것이 더 효율적입니다. 순서가 설정된 집합은 변경할 수 있지만 개체에 대한 포인터는 변경되지 않으므로 상수를 만드는 것이 좋습니다. – Garrett

+0

@ 가렛 절대적으로 감사합니다! – fujianjin6471

+0

안녕하세요! 신속하게 'let'을 사용해야하며 (@Garrett가 말했듯이) 다운 캐스트를 강제합니다. 'let mutableItems = items.mutableCopy() as! NSMutableOrderedSet' mutableItems.addObject (anItem)' 'items = mutableItems.copy() as! NSOrderedSet' –

0

이를위한 또 다른 방법으로 NSKeyValueCoding mutableOrderedSetValueForKey 함수이다. 당신은 말할 수

owningObject.mutableOrderedSetValueForKey("items").addObject(anItem)

불행하게도, 이것은 당신의 검사 컴파일 타임하지 않습니다 "항목을."

관련 문제