Ios 如何持久存储NSManagedObjectID?
为避免成为XY问题,以下是一些背景: 我的应用程序允许用户创建和保存很多设置,有点像Xcode的字体和颜色选择器: 这是因为用户可以设置很多东西。只需点击一个已保存的设置,而不是再次设置所有这些内容,会更容易 我使用核心数据来存储用户保存的设置。用户创建的每个设置都是Ios 如何持久存储NSManagedObjectID?,ios,swift,core-data,persistence,Ios,Swift,Core Data,Persistence,为避免成为XY问题,以下是一些背景: 我的应用程序允许用户创建和保存很多设置,有点像Xcode的字体和颜色选择器: 这是因为用户可以设置很多东西。只需点击一个已保存的设置,而不是再次设置所有这些内容,会更容易 我使用核心数据来存储用户保存的设置。用户创建的每个设置都是NSManagedObject子类的一个实例。现在我需要持久地存储所选的设置,这样当应用程序重新打开时,用户将选择与以前相同的设置 我的第一个想法是将NSManagedObject子类实例存储在NSUserDefaults中。但根
NSManagedObject
子类的一个实例。现在我需要持久地存储所选的设置,这样当应用程序重新打开时,用户将选择与以前相同的设置
我的第一个想法是将NSManagedObject
子类实例存储在NSUserDefaults
中。但根据文档,除非我将其转换为NSData,否则无法存储:
默认对象必须是属性列表,即NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的实例(或集合实例的组合)
然后我尝试存储NSManagedObject
子类实例的objectID
。我看到有一个URIRepresentation()
方法返回一个NSURL
。所以我认为这会起作用:
NSData(contentsOfURL: selectedOption!.objectID.URIRepresentation())
但是初始化器不知怎么失败了
现在我意识到这是一个愚蠢的想法,因为即使我可以将其转换为NSData
,我也无法将NSData
转换回NSManagedObjectID
根据,OP似乎能够存储对象id:
我将所选主题objectID存储在NSUserDefaults中,这样当应用程序重新启动时,所选主题仍将保持不变
我该怎么做呢?NSUserDefaults有“方便方法” 它允许存储和检索与获得的NSURL类似的
NSURL
通过URIRepresentation()
。与NSData的转换
处理过程是透明的。从:
当使用-[NSUserDefaults setURL:forKey://code>存储NSURL时,会进行一些调整:
任何非文件URL都是通过调用+[NSKeyedArchiver archivedDataWithRootObject:][/code>将NSURL实例用作根来编写的
反对李>
当使用-[NSUserDefaults URLForKey:
读取NSURL时,使用以下逻辑:
如果键的值是NSData,则NSData将用作+[NSKeyedUnarchiver unarchiveObjectWithData:][/code>的参数。如果NSData可以作为NSURL未归档,则返回NSURL,否则返回nil
因此,保存托管对象ID只需执行以下操作
NSUserDefaults.standardUserDefaults().setURL(object.objectID.URIRepresentation(),
forKey: "selected")
检索对象ID和对象,例如如下所示:
if let url = NSUserDefaults.standardUserDefaults().URLForKey("selected"),
let oid = context.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(url),
let object = try? context.existingObjectWithID(oid) {
print(object)
// ...
}
有关保存所选设置的其他方法,请参阅。您只需将URIRepresentation的字符串值存储在NSUserDefaults中即可。稍后,您可以加载该字符串,然后使用managedobjectdforurirepresentation
获取NSObjectId,然后使用objectWithID
获取NSManagedObject@Paulw11那么如何将字符串转换为相应的NSManagedObject?正如我所说,通过提供指向managedObjectdForUrirPresentation
的URL,以及在托管对象上下文上提供返回到objectWithID
的对象I'd,为什么不在数据存储中存储一个标志以指示当前选择,或者一个与当前内容有关系的当前设置实体-你根本不需要使用对象ID…那么我如何才能将URL/NSData转换回NSManagedObject?@Paulw11已经在问题的评论中回答了这个问题谢谢。实际上我刚吃完晚饭回来。这就是为什么我回复得这么晚。:)
if let url = NSUserDefaults.standardUserDefaults().URLForKey("selected"),
let oid = context.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(url),
let object = try? context.existingObjectWithID(oid) {
print(object)
// ...
}