ios5 - ¿Cómo agregar un elemento a NSOrderedSet para Core Data?
core-data (3)
Otra forma de hacerlo es con la función mutableOrderedSetValueForKey en NSKeyValueCoding. Tu puedes decir
owningObject.mutableOrderedSetValueForKey("items").addObject(anItem)
Lamentablemente, esto no le permite obtener la verificación de "elementos" en tiempo de compilación.
Hice algunos estudios en esta publicación . Pero ninguna de sus soluciones funciona para mí. Déjame explicarte lo que hice:
De hecho, es muy similar a la publicación mencionada.
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
En mi controlador de vista, cargo uno de la categoría:
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];
}
Tengo un botón en la barra de navegación para fines de prueba. Cuando se hace clic, copio el primer elemento y lo agrego al final.
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"];
El problema es que el artículo no se agrega a la base de datos. (Hice algunas pruebas, por ejemplo, modifiqué el contenido del ítem. Prueba que la base de datos no tiene ningún problema). Pero no sé la razón por la cual el ítem no está en la base de datos. ¿Alguien puede ayudar? Gracias
Rápido:
let mutableItems = items.mutableCopy() as! NSMutableOrderedSet
mutableItems.addObject(anItem)
items = mutableItems.copy() as! NSOrderedSet
C objetivo:
NSMutableOrderedSet *mutableItems = (NSMutableOrderedSet *)items.mutableCopy;
[mutableItems addObject:anItem];
items = (NSOrderedSet *)mutableItems.copy;
El problema resuelto Hay dos problemas:
- No se puede insertar / agregar un elemento existente
- Tengo un estúpido conflicto de nombres. Entonces la sugerencia en esta publicación es buena.
Gracias.