首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >核心数据迁移时如何拉取关系实体?

核心数据迁移时如何拉取关系实体?
EN

Stack Overflow用户
提问于 2020-04-15 06:59:33
回答 1查看 233关注 0票数 1

我正在执行核心数据迁移。我有这个子类用于我的迁移:

代码语言:javascript
复制
class TagtoSkillMigrationPolicyV1toV2: NSEntityMigrationPolicy {

    override func createDestinationInstances( forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {

        // 1 - create destination instance of skill and skillmetadata
        let skillEntityDescription = NSEntityDescription.entity( forEntityName: "Skill",in: manager.destinationContext)
        let newSkill = Skill(entity: skillEntityDescription!, insertInto: manager.destinationContext)

        let skillMetaDataDescription = NSEntityDescription.entity(forEntityName: "SkillMetaData", in: manager.destinationContext)
        newSkill.metaData = SkillMetaData(entity: skillMetaDataDescription!, insertInto: manager.destinationContext)

        var posts = sInstance.value(forKey: "posts")
        posts.sort {
            ($0.timeStamp! as Date) < ($1.timeStamp! as Date)
        }
        if let mostRecentThumbnail = posts.first?.postImage {
            let thumbnail = Utils.makeThusmbnail(url: URL(string: mostRecentThumbnail)!, for: 150.0)
            newSkill.metaData?.thumbnail = thumbnail?.pngData()
        }

        if let name = sInstance.value(forKey: "name"){
            newSkill.setValue(name, forKey: "name")
        }
        manager.associate(sourceInstance: sInstance, withDestinationInstance: newSkill, for: mapping)
    }
}

此自定义迁移是从我的旧标记实体迁移到我的新技能实体。对于每个标记,它创建一个skill实体和一个附加到它的skillmetaData实体。.xcmappingmodel文件中没有条目,因为我所有的操作都是手动完成的-如果我仍然需要条目,请让我知道。

现在,当它运行时,它会给出一个信号SIGABRT:

代码语言:javascript
复制
Could not cast value of type '_NSFaultingMutableOrderedSet' (0x7fff87c44e80) to 'NSArray' (0x7fff87c51fb0).
2020-04-14 15:55:40.108927-0700 SweatNetOffline[28046:3645007] Could not cast value of type '_NSFaultingMutableOrderedSet' (0x7fff87c44e80) to 'NSArray' (0x7fff87c51fb0).

当我设置断点并检查sInstance.value(forKey: "posts")时,我得到

代码语言:javascript
复制
▿ Optional<Any>
  - some : Relationship 'posts' fault on managed object (0x6000010dcf00) <NSManagedObject: 0x6000010dcf00> (entity: Tag; id: 0xdf4b05c2e82b2c4e <x-coredata://A6586C18-60C3-40E7-B469-293A50EB5728/Tag/p1>; data: {
    latestUpdate = "2011-03-13 00:17:25 +0000";
    name = flowers;
    posts = "<relationship fault: 0x600002607f40 'posts'>";
    uuid = "4509C1B3-7D0F-4BBD-AA0B-7C7BC848DA80";
})

所以它并不是完全加载那些帖子--它给出了那个错误。

我们的目标是从最新的帖子中获得缩略图。如何访问此关系项?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-16 05:07:27

我找到了一种方法,可以使用

代码语言:javascript
复制
let lastThumbnail = sInstance.mutableOrderedSetValue(forKeyPath: "posts.postImage").lastObject

阅读this很有帮助。我的理解是,在迁移的这一点上,我们正在处理NSManagedObjects,而不是具有核心数据中通常具有的"posts“属性的实际模型。

特别是在Objective-C中,在某种程度上,NSObjects是通过键值编码来访问的。它们是间接访问的-这意味着不是读取对象本身,而是读取NSMutableOrderedSet想要向您显示的那个键的内容-因此它可以在呈现它之前对其进行操作。因此,例如,您不能只获取"forKey: posts“,然后期望帖子具有您的帖子通常具有的属性。如果他们知道更多,欢迎任何人充实这个解释:)。

我想做的一件事就是通过这个键--路径--以一种可排序的方式来获取--这样我就可以找到具有最新时间戳的帖子,然后使用相关的缩略图。相反,我使用的是.lastObject,它之所以有效,是因为这是一个NSMutableOrderedSet,而不是NSMutableSet,因为我的原始模型将这个关系指定为有序关系。这意味着它将选择最后插入的项目,这对我来说目前是可以的。不过,如果有人有什么建议的话,我还是对过滤结果的方式感兴趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61218646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档