在CoreData的NSOrderedSet中的特定位置插入一个对象?

Posted

技术标签:

【中文标题】在CoreData的NSOrderedSet中的特定位置插入一个对象?【英文标题】:Insert an object at a specific position in NSOrderedSet in CoreData? 【发布时间】:2016-09-22 21:32:26 【问题描述】:

在 CoreData 中设置“To Many”关系并勾选“Ordered”框将您的属性定义为 NSOrderedSet。

有没有一种有效的方法可以在特定位置插入对象或上下移动对象?

或者我是否需要使用来自 NSOrderedSet 的数据创建一个 NSMutabledOrderedSet,插入或移动我的对象,然后将其转换回 NSOrderedSet?

或者我应该使用标准的 NSSet 并自己管理“位置”属性?

【问题讨论】:

【参考方案1】:

CoreData 'Create NSManagedObject Subclasses...' 将生成许多方法供您用来操作您的有序集合。或者您可以对 Codegen 执行相同的操作。

目标 C

@interface MyObject (CoreDataGeneratedAccessors)

- (void)insertObject:(NSManagedObject *)value inItemsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromItemsAtIndex:(NSUInteger)idx;
- (void)insertItems:(NSArray<NSManagedObject *> *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeItemsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInItemsAtIndex:(NSUInteger)idx withObject:(NSManagedObject *)value;
- (void)replaceItemsAtIndexes:(NSIndexSet *)indexes withItems:(NSArray<NSManagedObject *> *)values;
- (void)addItemsObject:(NSManagedObject *)value;
- (void)removeItemsObject:(NSManagedObject *)value;
- (void)addItems:(NSOrderedSet<NSManagedObject *> *)values;
- (void)removeItems:(NSOrderedSet<NSManagedObject *> *)values;

@end

斯威夫特

// MARK: Generated accessors for items
extension MyObject 

    @objc(insertObject:inItemsAtIndex:)
    @NSManaged public func insertIntoItems(_ value: NSManagedObject, at idx: Int)

    @objc(removeObjectFromItemsAtIndex:)
    @NSManaged public func removeFromItems(at idx: Int)

    @objc(insertItems:atIndexes:)
    @NSManaged public func insertIntoItems(_ values: [NSManagedObject], at indexes: NSIndexSet)

    @objc(removeItemsAtIndexes:)
    @NSManaged public func removeFromItems(at indexes: NSIndexSet)

    @objc(replaceObjectInItemsAtIndex:withObject:)
    @NSManaged public func replaceItems(at idx: Int, with value: NSManagedObject)

    @objc(replaceItemsAtIndexes:withItems:)
    @NSManaged public func replaceItems(at indexes: NSIndexSet, with values: [NSManagedObject])

    @objc(addItemsObject:)
    @NSManaged public func addToItems(_ value: NSManagedObject)

    @objc(removeItemsObject:)
    @NSManaged public func removeFromItems(_ value: NSManagedObject)

    @objc(addItems:)
    @NSManaged public func addToItems(_ values: NSOrderedSet)

    @objc(removeItems:)
    @NSManaged public func removeFromItems(_ values: NSOrderedSet)


否则,只需制作一个可变副本,根据需要进行操作,然后将其设置回 NSManagedObject。顺便说一句,您也不需要将其转换回非可变集

【讨论】:

您能否澄清一下这些方法是在哪里生成的?它们似乎不适用于我的属性。我正在使用 Swift,属性声明如下:code@NSManaged var elements: NSOrderedSet?如果我开始输入以下内容,它不会自动完成:elements.insert 它们在swift中会以不同的方式命名,核心数据会生成YourClass+CoreDataProperties.swift它们会在里面 已经生成的Class+CoreDataProperties.swift只有属性。没有方法。顺便说一句,我正在使用 ios 我刚刚在一个新的 swift 项目中完成了这项工作,并将生成的方法的 swift 版本添加到我的答案中。 不要制作可变副本,使用mutableOrderedSetValueForKey

以上是关于在CoreData的NSOrderedSet中的特定位置插入一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

Coredata、NSOrderedSet 和 iCloud

如何在 SwiftUI 中从 FetchedResults (CoreData) 中获取 NSOrderedSet

在 CoreData 中使用 NSOrderedSet 重新排序 UITableView

Coredata 和 NSOrderedSet - 如何定义集合的顺序?

在 CoreData 的 NSOrderedSet 中查找对象。索引(无障碍元素:)

CoreData NSOrderedSet - 修复?