是否可以在 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
支持以下数据类型:
NSString
、NSNumber
、NSDate
、NSArray
、NSDictionary
和 NSData
希望对你有所帮助。
【讨论】:
【参考方案4】:NSUserDefaults
中的可存储类型。
NSUserDefaults
类的行为非常类似于称为属性列表(又名 plist)的东西。它可能只是一个 plist 的精美界面,或者可能更多,我不完全确定。尽管如此,plist 可以存储的对象类型是有限的。 plist 可以存储的六种类型是:
所以,你需要使用NSKeyedArchiver
。
let ArchvieArr = NSMutableArray()
ArchvieArr.addObject(NSKeyedArchiver.archivedDataWithRootObject(LiftObj)).
NSUserDefaults.standardUserDefaults().setObject(ArchvieArr, forKey: "savedArray")
【讨论】:
以上是关于是否可以在 NSUserDefaults 中保存 NSManagedObject?的主要内容,如果未能解决你的问题,请参考以下文章
即使应用程序将被删除,如何在 NSUserDefaults 中保存数据?
NSUserDefaults 是不是由 iCloud 自动保存?