是否可以在NSUserDefaults中保存NSManagedObject?

时间:2016-12-01 05:46:49

标签: ios swift core-data nsuserdefaults nsmanagedobject

我在userDefaults中保存NSManagedObject时遇到困难,我想知道a)我应该尝试这样做,还是这不是一种合适的方法,或者b)如果这是一种合适的方法,我怎么能得到它起作用了?

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

这是具有属性的扩展名:

extension Lift {

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

   }

和带有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

    }
  }

我之前已经处理过这些类型的错误,所以我真正担心的是我是否走错了路。

我今晚阅读了很多线程,它们告诉我,我需要编码一个对象(但不是特别是一个NSManagedObject)来保存它然后在检索它时未编码它并且我的类必须符合NSCoding以及那个协议要求。但后来我看到threadsNSManagedObjects应该存储在userDefaults中,但我不知道这是否属实。

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

4 个答案:

答案 0 :(得分:3)

不,您不应在NSManagedObject中存储NSUserDefaults。核心数据是一种对象持久性技术,因此尝试以某种其他格式保留NSManagedObject是没有意义的。

您可以使用的替代品很少:

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

答案 1 :(得分:0)

不,你不能这样做。您无法在“用户默认值”中保存Core Data对象。它只能保存在DB中。

答案 2 :(得分:0)

NSUserDefaults中的可存储类型。 NSUserDefaults类的行为非常类似于属性列表(也称为plist)。对于一个plist来说它可能只是一个奇特的界面,或者它可能更多,我不完全确定。尽管如此,plist仍然限制他们可以存储什么样的对象。六种类型的plists可以存储:

  • NSData的
  • 的NSString
  • 的NSNumber
  • 的NSDate
  • 的NSArray
  • 的NSDictionary

因此,您需要在NSKeyedArchiver中使用。

let ArchvieArr = NSMutableArray()
ArchvieArr.addObject(NSKeyedArchiver.archivedDataWithRootObject(LiftObj)).
NSUserDefaults.standardUserDefaults().setObject(ArchvieArr, forKey: "savedArray")

答案 3 :(得分:0)

这两个完全是两回事。 NSUserDefault存储了NSManagedObject存储轻量级或大量数据的轻量级数据,并且速度非常快NSUserDefault 1}}用于存储和检索目的。

NSManagedObject -> NSManagedObject链接到 coredata 。 你应该存储一大堆元素。至于您的上一个问题,没有什么能阻止您同时使用Core Data和后端来存储数据。事实上,有一些框架可以促进这一点。

NSUserDefaults -> NSUserDefaults是一个允许不同数据类型的简单存储的类。它非常适合在应用程序启动或设备重启之间持续存在的少量信息。 NSUserDefaults不足以存储和查询大量数据。如果您有一个后端(服务器上的数据库)来存储事件及其被邀请者持续存在,这是明智的。用户信息的一致性(如果用户从其他应用程序支持设备登录到您的应用程序,那么他将获得他存储的所有信息)。 NSUserDefaults支持以下数据类型: NSStringNSNumberNSDateNSArrayNSDictionaryNSData

希望它会对你有所帮助。