是否可以在 NSUserDefaults 中保存 NSManagedObject?

Jim*_*Jim 2 core-data nsuserdefaults nsmanagedobject ios swift

我在 userDefaults 中保存 NSManagedObject 有困难,我想知道 a) 我应该尝试这样做还是这不是一种合适的方法,或者 b) 如果它是一种合适的方法,我怎样才能让它工作?

我正在用 Swift 2.3 编写我的应用程序,它有一些用户默认选项,其中一个用于默认“提升”(如举重,例如“卧推”、“挺举”、“倾斜卧推” )。我实际上将它们从枚举转换为核心数据实体,因为用户能够跟踪的每个电梯事件都将是可用的电梯类型之一(我将为其建立适当的关系)。

这是具有属性的扩展:

extension Lift {

    @NSManaged var liftName: String
    @NSManaged var type: NSSet

   }
Run Code Online (Sandbox Code Playgroud)

以及带有 Xcode 抱怨的 Lift 实体:

class Lift: NSManagedObject, NSCoding {
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(liftName, forKey: "liftName")
    } // Super.init isn't called on all paths before returning from initializer

required init(coder aDecoder: NSCoder) {

    // Initialization of immutable variable was never used, etc...
    let liftName = aDecoder.decodeObjectForKey("liftName") as! String

    }
  }
Run Code Online (Sandbox Code Playgroud)

我以前处理过这些类型的错误,所以我真正关心的是我是否走上了错误的道路。

今晚我读了很多线程,这些线程告诉我我需要对一个对象(但不是特别是 NSManagedObject)进行编码以保存它,然后在检索它时将其取消编码,并且我的类必须符合 NSCoding 以及该协议要求的内容。但后来我看到线程是说NSManagedObjects应该被存储在userDefaults,但我不知道这是不是真的。

我已经在这上面花了几个小时,所以在我走得更远之前,可以/应该这样做吗?

Pau*_*w11 5

不,你不应该存储NSManagedObjectin NSUserDefaults。Core Data 是一种对象持久化技术,因此尝试NSManagedObject以其他格式持久化 an 是没有意义的。

您可以使用以下几种替代方法:

  1. 您可以简单地将电梯的名称存储在您的用户默认值中,然后查询它以从 Core Data 中取回对象。如果电梯名称不唯一,这可能对您不起作用
  2. 您可以向 Lift 实体添加标识符属性,并在该属性中存储类似 UUID 字符串的内容;然后,您可以在 UserDefaults 中存储相同的字符串。这将确保唯一选择一个对象。
  3. 您可以向 Lift 实体添加一个新的布尔属性,default然后再次使用查询来检索它;您需要确保一次仅在一次电梯上将该值设置为 true。
  4. 您可以使用managedObject.objectId.uriRepresentation来获取可以存储为字符串的 URL,然后用于稍后检索对象。这可能是最复杂的解决方案,我建议您尝试其他选项之一。