【问题标题】:How to add element to NSOrderedSet for Core Data?如何为核心数据添加元素到 NSOrderedSet?
【发布时间】:2012-08-31 03:24:18
【问题描述】:

我对此post 进行了一些研究。但它的解决方案都不适合我。让我解释一下我做了什么:

实际上和上面提到的帖子非常相似。

类别.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"];

问题是该项目根本没有添加到数据库中。 (我做了一些测试,比如我修改了item的内容,证明数据库完全没有问题。)但是不知道item没有到数据库的原因。有人可以帮忙吗?谢谢

【问题讨论】:

  • 我可以使用 NSEntityDescription insertNewObjectForEntityForName 将新项目添加到项目的末尾。但这并没有解决我的问题,因为我无法在类别中的项目中间插入新项目。

标签: ios5 core-data nsorderedset


【解决方案1】:

问题解决了。有两个问题:

  1. 无法插入/添加现有项目
  2. 我有一个愚蠢的名称冲突。所以this post的建议不错。

谢谢。

【讨论】:

    【解决方案2】:

    斯威夫特:

    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;
    

    【讨论】:

    • 使用“let”将mutableItems 设为常量会更有效。虽然有序集是可变的,但指向对象的指针不会改变,因此最好设为常量。
    • 嘿!迅速你应该使用let(正如@Garrett所说)并强制向下转换:let mutableItems = items.mutableCopy() as! NSMutableOrderedSetmutableItems.addObject(anItem)items = mutableItems.copy() as! NSOrderedSet
    • @PaulSlm 更新了,Swift 变化太快了!
    【解决方案3】:

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

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

    不幸的是,这不会让您在编译时检查“项目”。

    【讨论】:

      【解决方案4】:

      Swift 5 及以上

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

      【讨论】:

        猜你喜欢
        • 2013-04-19
        • 2016-01-25
        • 2014-03-20
        • 1970-01-01
        • 2011-12-18
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多