CoreData NSManagedObject != NIL 怎么可能不包含任何数据(数据:<fault>)?

How can CoreData NSManagedObject != NIL but does not contain any data (data: <fault>)?

我在使用 CoreData 时遇到了一个很奇怪的问题。我得到了一个扩展,它通过 使用 UserDefaults 保存 获取保存在 CoreData 中的活动配置文件 来存储 活动配置文件 ObjectID.

extension NSPersistentContainer {
    private var managedObjectIDKey: String {
        return "activeUserObjectID"
    }

    var activeUser: Profile? {
        get {
            guard let url = UserDefaults.standard.url(forKey: managedObjectIDKey) else {
                return nil
            }

            guard let managedObjectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: url) else {
                return nil
            }

            return viewContext.object(with: managedObjectID) as? Profile
        }
        set {
            guard let newValue = newValue else {
                UserDefaults.standard.removeObject(forKey: managedObjectIDKey)
                return
            }

            UserDefaults.standard.set(newValue.objectID.uriRepresentation(), forKey: managedObjectIDKey)
        }
    }
}

整个想法大部分时间都运行良好,但后来我发现了一个非常奇怪的错误。用户可以删除个人资料 (但不是当前活动的个人资料!)

错误如下:一旦我删除例如Profile 2Profile 1 被激活时,一旦删除完成 Profile 1 就不再被激活。

当试图打印出 activeUser 变量时,它 returns 只有 data: fault 而不是 data: {all the数据}。请参阅下面的屏幕截图:

删除前打印第一行Profile 2,删除配置文件后直接打印第二行,再次激活配置文件后打印第三行

我不知道是什么导致了这个错误,我花了很多时间来寻找这个错误,但一直没有成功。

如果您有任何想法,请立即告诉我。删除一个后,所有 NSManagedObjects 的 ObjectID 是否会发生变化?或者还有什么我没有想到的?

提前感谢您的帮助。

显示<fault>的对象的对象id与其他两个不同。如果我理解正确,您的意图是始终保持相同的配置文件处于活动状态,但情况似乎并非如此,即某些东西正在激活不同的配置文件。