是否可以在 NSUserDefaults 中保存 NSManagedObject?
Is it possible to save an NSManagedObject in NSUserDefaults?
我在 userDefaults 中保存 NSManagedObject 时遇到困难,我想知道 a) 我应该尝试这样做还是这不是一种合适的方法或 b) 如果它是一种合适的方法,如何才能我让它工作?
我在 Swift 2.3 中编写我的应用程序,它有一些用户默认选项,其中一个是默认选项 "lift"(如举重,例如 'bench press' , 'clean and jerk', 'incline bench press').我实际上是将它们从枚举转换为核心数据实体,因为用户能够跟踪的每个提升事件都将是可用的提升类型之一(我将为其建立适当的关系)。
这是具有以下属性的扩展:
extension Lift {
@NSManaged var liftName: String
@NSManaged var type: NSSet
}
带有东西的 Lift 实体 Xcode 正在抱怨:
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)进行编码以保存它,然后在检索它时取消编码,我的 class 必须符合 NSCoding 以及该协议的要求。但是后来我看到 说 NSManagedObjects
应该 NOT 存储在 userDefaults
中,但我不知道这是不是真的。
我已经为此花费了几个小时,所以在我继续之前,can/should完成了吗?
不,你不能这样做。您不能将核心数据对象保存在用户默认值中。它只能保存在它的数据库中。
NSUserDefaults
中的可存储类型。
NSUserDefaults
class 的行为非常类似于称为 属性 列表(又名 plist)的东西。它可能只是一个 plist 的奇特界面,或者它可能更多,我不完全确定。尽管如此,plist 在它们可以存储的对象类型方面是有限的。 plist 可以存储的六种类型是:
- NSData
- NSString
- NSNumber
- NSDate
- NSArray
- NS 词典
因此,您需要在 NSKeyedArchiver
.
中使用
let ArchvieArr = NSMutableArray()
ArchvieArr.addObject(NSKeyedArchiver.archivedDataWithRootObject(LiftObj)).
NSUserDefaults.standardUserDefaults().setObject(ArchvieArr, forKey: "savedArray")
不,您不应该在 NSUserDefaults
中存储 NSManagedObject
。 Core Data 是一种对象持久化技术,因此尝试以其他格式持久化 NSManagedObject
是没有意义的。
您可以使用的备选方案很少:
- 您可以简单地将电梯的名称存储在您的用户默认值中,然后查询它以从 Core Data 中取回对象。如果电梯名称不是唯一的,这可能对您不起作用
- 您可以向您的 Lift 实体添加一个标识符属性,并在该属性中存储类似 UUID 字符串的内容;然后您可以将相同的字符串存储在 UserDefaults 中。这将确保唯一选择一个对象。
- 您可以将新的布尔属性添加到您的 Lift 实体
default
并再次使用查询来检索它;您需要确保一次仅将一部电梯的值设置为 true。
- 您可以使用
managedObject.objectId.uriRepresentation
获取一个 URL,您可以将其存储为字符串,然后用于稍后检索对象。这可能是最复杂的解决方案,我建议您尝试其他选项之一。
这两个完全是两个不同的东西。 NSUserDefault
存储轻量数据,NSManagedObject
存储轻量或大量数据并且是存储和检索速度比 NSUserDefault
快。
NSManagedObject -> NSManagedObject
link 到 coredata。
您应该使用它来存储大量元素。至于你的最后一个问题,没有什么能阻止你同时使用核心数据和后端来存储你的数据。事实上,有一些框架可以促进这一点。
NSUserDefaults -> NSUserDefaults
是一个class,允许简单存储 不同的数据类型。它非常适合您需要在应用程序启动或设备重启之间保留的少量信息。 NSUserDefaults
存储和查询大量数据不够可靠。 建议您是否有一个后端(服务器上的数据库)来存储事件及其事件受邀者保持用户信息的一致性(如果用户从其他应用程序支持设备重新登录到您的应用程序,那么他将获得他存储的所有信息)。
NSUserDefaults
支持以下数据类型:
NSString
、NSNumber
、NSDate
、NSArray
、NSDictionary
和 NSData
希望对您有所帮助。
我在 userDefaults 中保存 NSManagedObject 时遇到困难,我想知道 a) 我应该尝试这样做还是这不是一种合适的方法或 b) 如果它是一种合适的方法,如何才能我让它工作?
我在 Swift 2.3 中编写我的应用程序,它有一些用户默认选项,其中一个是默认选项 "lift"(如举重,例如 'bench press' , 'clean and jerk', 'incline bench press').我实际上是将它们从枚举转换为核心数据实体,因为用户能够跟踪的每个提升事件都将是可用的提升类型之一(我将为其建立适当的关系)。
这是具有以下属性的扩展:
extension Lift {
@NSManaged var liftName: String
@NSManaged var type: NSSet
}
带有东西的 Lift 实体 Xcode 正在抱怨:
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)进行编码以保存它,然后在检索它时取消编码,我的 class 必须符合 NSCoding 以及该协议的要求。但是后来我看到 NSManagedObjects
应该 NOT 存储在 userDefaults
中,但我不知道这是不是真的。
我已经为此花费了几个小时,所以在我继续之前,can/should完成了吗?
不,你不能这样做。您不能将核心数据对象保存在用户默认值中。它只能保存在它的数据库中。
NSUserDefaults
中的可存储类型。
NSUserDefaults
class 的行为非常类似于称为 属性 列表(又名 plist)的东西。它可能只是一个 plist 的奇特界面,或者它可能更多,我不完全确定。尽管如此,plist 在它们可以存储的对象类型方面是有限的。 plist 可以存储的六种类型是:
- NSData
- NSString
- NSNumber
- NSDate
- NSArray
- NS 词典
因此,您需要在 NSKeyedArchiver
.
let ArchvieArr = NSMutableArray()
ArchvieArr.addObject(NSKeyedArchiver.archivedDataWithRootObject(LiftObj)).
NSUserDefaults.standardUserDefaults().setObject(ArchvieArr, forKey: "savedArray")
不,您不应该在 NSUserDefaults
中存储 NSManagedObject
。 Core Data 是一种对象持久化技术,因此尝试以其他格式持久化 NSManagedObject
是没有意义的。
您可以使用的备选方案很少:
- 您可以简单地将电梯的名称存储在您的用户默认值中,然后查询它以从 Core Data 中取回对象。如果电梯名称不是唯一的,这可能对您不起作用
- 您可以向您的 Lift 实体添加一个标识符属性,并在该属性中存储类似 UUID 字符串的内容;然后您可以将相同的字符串存储在 UserDefaults 中。这将确保唯一选择一个对象。
- 您可以将新的布尔属性添加到您的 Lift 实体
default
并再次使用查询来检索它;您需要确保一次仅将一部电梯的值设置为 true。 - 您可以使用
managedObject.objectId.uriRepresentation
获取一个 URL,您可以将其存储为字符串,然后用于稍后检索对象。这可能是最复杂的解决方案,我建议您尝试其他选项之一。
这两个完全是两个不同的东西。 NSUserDefault
存储轻量数据,NSManagedObject
存储轻量或大量数据并且是存储和检索速度比 NSUserDefault
快。
NSManagedObject -> NSManagedObject
link 到 coredata。
您应该使用它来存储大量元素。至于你的最后一个问题,没有什么能阻止你同时使用核心数据和后端来存储你的数据。事实上,有一些框架可以促进这一点。
NSUserDefaults -> NSUserDefaults
是一个class,允许简单存储 不同的数据类型。它非常适合您需要在应用程序启动或设备重启之间保留的少量信息。 NSUserDefaults
存储和查询大量数据不够可靠。 建议您是否有一个后端(服务器上的数据库)来存储事件及其事件受邀者保持用户信息的一致性(如果用户从其他应用程序支持设备重新登录到您的应用程序,那么他将获得他存储的所有信息)。
NSUserDefaults
支持以下数据类型:
NSString
、NSNumber
、NSDate
、NSArray
、NSDictionary
和 NSData
希望对您有所帮助。