I did some studies on this post. But none of its solution work for me. Let me explain what I did:
It's actually very similar with the mentioned post.
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
In my view controller, I load one of the category:
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];
}
I have a button in navigation bar for testing purpose. When it's clicked I'll copy the first item and add to the end.
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"];
The problem is the item is not added to database at all. (I did some testing, for example, I modify the item content. It proves that the database has no problem at all.) But I don't know the reason why the item is not to the database. Can anybody help? Thanks
Another way of doing this is with the mutableOrderedSetValueForKey
function in NSKeyValueCoding. You could say
owningObject.mutableOrderedSetValueForKey("items").addObject(anItem)
Unfortunately, this doesn't get you the compile-time checking of "items."
Swift:
let mutableItems = items.mutableCopy() as! NSMutableOrderedSet
mutableItems.addObject(anItem)
items = mutableItems.copy() as! NSOrderedSet
Objective-C:
NSMutableOrderedSet *mutableItems = (NSMutableOrderedSet *)items.mutableCopy;
[mutableItems addObject:anItem];
items = (NSOrderedSet *)mutableItems.copy;
The problem solved. There are two problems:
Thanks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With