Ios5 如何为核心数据向数据集添加元素?

Ios5 如何为核心数据向数据集添加元素?,ios5,core-data,nsorderedset,Ios5,Core Data,Nsorderedset,我对此做了一些研究。但是没有一个解决方案对我有效。让我解释一下我做了什么: 事实上,这与上面提到的帖子非常相似 h类 @class Category, Item; @interface Category : NSManagedObject @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSOrderedSet *items; @property (nonatomic, retain)

我对此做了一些研究。但是没有一个解决方案对我有效。让我解释一下我做了什么:

事实上,这与上面提到的帖子非常相似

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"];

问题是该项根本没有添加到数据库中。(我做了一些测试,例如,我修改了项目内容。这证明了数据库没有任何问题。)但我不知道项目不在数据库中的原因。有人能帮忙吗?谢谢,问题解决了。有两个问题:

  • 无法插入/添加现有项目
  • 我有一个愚蠢的名字冲突。因此,中的建议是好的
  • 谢谢。

    斯威夫特:

    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;
    

    另一种方法是使用NSKeyValueCoding中的
    mutableOrderedSetValueForKey
    函数。你可以说

    owningObject.mutableOrderedSetValueForKey(“项目”).addObject(anItem)

    不幸的是,这并不能让您完成“items”的编译时检查。

    Swift 5及以上版本
    我可以使用NSEntityDescription insertNewObjectForEntityForName将新项添加到项的末尾。但是它不能解决我的问题,因为我没有办法把新的项目插入到我的项目中的中间。有一个常数使用“Lead”是更有效的。<>代码> Mutable项。在swift中,您应该使用
    let
    (正如@Garrett所说)并强制向下广播:
    let mutableItems=items.mutableCopy()as!NSMutableOrderedSet
    mutableItems.addObject(anItem)
    items=mutableItems.copy()as!传感器数据集
    @PaulSlm更新,Swift变化太快了!
    let mutableItems = items.mutableCopy() as! NSMutableOrderedSet
    mutableItems.add(anItem)
    items = mutableItems.copy() as! NSOrderedSet