是否可以在 NSUserDefaults 中保存 NSManagedObject?

Posted

技术标签:

【中文标题】是否可以在 NSUserDefaults 中保存 NSManagedObject?【英文标题】:Is it possible to save an NSManagedObject in NSUserDefaults? 【发布时间】:2016-12-01 05:46:49 【问题描述】:

我在 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 和什么协议要求。但是后来我看到threads 说NSManagedObjects 应该 存储在userDefaults 中,但我不知道这是不是真的。

我已经为此花费了几个小时,所以在我继续之前,可以/应该这样做吗?

【问题讨论】:

【参考方案1】:

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

您可以使用的替代方案很少:

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

【讨论】:

非常感谢@Paulw11 的回答和替代方法。您为我节省了数小时的浪费时间。【参考方案2】:

不,你不能这样做。您不能将 Core Data 对象保存在 User Defaults 中。它只能保存在它的数据库中。

【讨论】:

【参考方案3】:

这两者完全是两个不同的东西。 NSUserDefault 存储轻量数据,NSManagedObject 存储轻量或大量数据,并且比 NSUserDefault 存储和检索目的。

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

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

希望对你有所帮助。

【讨论】:

【参考方案4】:

NSUserDefaults 中的可存储类型。 NSUserDefaults 类的行为非常类似于称为属性列表(又名 plist)的东西。它可能只是一个 plist 的精美界面,或者可能更多,我不完全确定。尽管如此,plist 可以存储的对象类型是有限的。 plist 可以存储的六种类型是:

NSData NSString NSNumber NSDate NSArray NSDictionary

所以,你需要使用NSKeyedArchiver

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

【讨论】:

以上是关于是否可以在 NSUserDefaults 中保存 NSManagedObject?的主要内容,如果未能解决你的问题,请参考以下文章

将转换保存到 NSUserDefaults?

即使应用程序将被删除,如何在 NSUserDefaults 中保存数据?

NSUserDefaults 是不是由 iCloud 自动保存?

NSUserDefaults 保存的数据使其进入应用商店

你可以在 NSUserDefaults 中保存 Parse 信息吗? (IOS)

Objective-C 在 NSUserDefaults 中保存 NSColor