将新的核心数据对象插入到多对多的 NSOrderedSet 中会忽略索引
Inserting new Core Data object to to-many NSOrderedSet ignores index
将新的核心数据实体 (EntityB) 插入另一个实体 (EntityA) 的 NSOrderedSet 关系 属性 时,我遇到了一个奇怪的行为; index
被忽略,对象总是插入到有序集的末尾。
正在插入的对象是现有对象的副本,使用通过自定义副本初始值设定项创建的不同父实体:
// EntityA
@NSManaged var entityBs: NSOrderedSet // to-many relationship
// EntityB
@NSManaged var entityA: EntityA?
// Inserting EntityB copy into EntityA
let entityBCopy = EntityB(entityB: entityBOriginal, newParent: entityA)
entityA.insertIntoEntityBs(entityBCopy, at: index)
entityBs
插入前:
entity0
entity1
entity2
entity3
entity4
entityBs
在索引 2 处插入 newEntity2
后:
entity0
entity1
entity2
entity3
entity4
newEntity2 < inserted at the end of ordered set, not at index 2
我已确认 index
在 entityBs
内容的范围内。
EntityA 使用 Core Data Generated Accessors,但我也尝试通过键值编码方法手动插入对象 - 出现同样的问题。这让我怀疑这是不是 NSOrderedSet 的问题,而不是核心数据的问题。
我不知道为什么会这样,欢迎提供任何信息!
问题在于 entityBCopy
的初始化,特别是 newParent
参数。使用父关系初始化 EntityB
,然后立即将 EntityB
实例插入同一父对象是多余的。 Core Data 生成的 insert
方法应该处理在 entityBCopy
上设置父 属性,假设模型中的所有设置都正确。
因此,从初始化程序中删除 newParent
参数应该会导致在正确的索引处插入:
// Inserting EntityB copy into EntityA
let entityBCopy = EntityB(entityB: entityBOriginal)
entityA.insertIntoEntityBs(entityBCopy, at: index)
编码愉快!
将新的核心数据实体 (EntityB) 插入另一个实体 (EntityA) 的 NSOrderedSet 关系 属性 时,我遇到了一个奇怪的行为; index
被忽略,对象总是插入到有序集的末尾。
正在插入的对象是现有对象的副本,使用通过自定义副本初始值设定项创建的不同父实体:
// EntityA
@NSManaged var entityBs: NSOrderedSet // to-many relationship
// EntityB
@NSManaged var entityA: EntityA?
// Inserting EntityB copy into EntityA
let entityBCopy = EntityB(entityB: entityBOriginal, newParent: entityA)
entityA.insertIntoEntityBs(entityBCopy, at: index)
entityBs
插入前:
entity0
entity1
entity2
entity3
entity4
entityBs
在索引 2 处插入 newEntity2
后:
entity0
entity1
entity2
entity3
entity4
newEntity2 < inserted at the end of ordered set, not at index 2
我已确认 index
在 entityBs
内容的范围内。
EntityA 使用 Core Data Generated Accessors,但我也尝试通过键值编码方法手动插入对象 - 出现同样的问题。这让我怀疑这是不是 NSOrderedSet 的问题,而不是核心数据的问题。
我不知道为什么会这样,欢迎提供任何信息!
问题在于 entityBCopy
的初始化,特别是 newParent
参数。使用父关系初始化 EntityB
,然后立即将 EntityB
实例插入同一父对象是多余的。 Core Data 生成的 insert
方法应该处理在 entityBCopy
上设置父 属性,假设模型中的所有设置都正确。
因此,从初始化程序中删除 newParent
参数应该会导致在正确的索引处插入:
// Inserting EntityB copy into EntityA
let entityBCopy = EntityB(entityB: entityBOriginal)
entityA.insertIntoEntityBs(entityBCopy, at: index)
编码愉快!