关于ios:如何持久存储一个NSManagedObjectID? | 珊瑚贝

How to store a NSManagedObjectID persistently?


为避免成为 XY 问题,这里有一些背景:

我的应用程序允许用户创建和保存很多设置,有点像 Xcode 的字体和颜色选择器:

enter

这是因为用户可以设置很多东西。只需点击已保存的设置而不是再次设置所有这些设置会更容易。

我使用 Core Data 来存储用户保存的设置。用户创建的每个设置都是 NSManagedObject 子类的一个实例。现在我需要永久存储所选设置,以便在应用重新打开时用户将选择与以前相同的设置。

我的第一个想法是将 NSManagedObject 子类实例存储在 NSUserDefaults 中。但是根据文档,除非我将其转换为 NSData:

,否则我无法存储它

A default object must be a property list, that is, an instance of (or for collections a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary.

然后我尝试存储 NSManagedObject 子类实例的 objectID。我看到有一个返回 NSURL 的 URIRepresentation() 方法。所以我认为这会起作用:

1
NSData(contentsOfURL: selectedOption!.objectID.URIRepresentation())

但是初始化程序以某种方式失败了。

现在我意识到这是一个愚蠢的想法,因为即使我可以将其转换为 NSData,我也无法将 NSData 转换回 NSManagedObjectID!

根据this question,OP似乎能够存储对象id:

I store the selected theme objectID in NSUserDefaults so that when the app restarts, the selected theme will still be intact.

我该怎么做呢?

  • 您可以简单地将 URIRepresentation 的字符串值存储在 NSUserDefaults 中。稍后您可以加载该字符串,然后使用 managedObjectIDForURIRepresentation 获取 NSObjectId,然后使用 objectWithID 获取 NSManagedObject
  • @Paulw11 那么如何将字符串转换为相应的 NSManagedObject?
  • 正如我所说,通过将 URL 提供给 managedObjectIDForURIRrepresentation 并提供返回给 objectWithID 的对象在您的托管对象上下文中
  • 为什么不在数据存储中存储一个标志以指示当前选择,或者与当前内容相关的当前设置实体 – 您根本不需要使用对象 ID…


NSUserDefaults 有”便利方法”

1
2
public func setURL(url: NSURL?, forKey defaultName: String)
public func URLForKey(defaultName: String) -> NSURL?

允许存储和检索 NSURL 就像获得的一样
通过 URIRepresentation()。 NSData 之间的转换
被透明地处理。来自文档:

When an NSURL is stored using -[NSUserDefaults setURL:forKey:], some adjustments are made:

  • Any non-file URL is written by calling +[NSKeyedArchiver archivedDataWithRootObject:] using the NSURL instance as the root
    object.
  • When an NSURL is read using -[NSUserDefaults URLForKey:], the following logic is used:

  • If the value for the key is an NSData, the NSData is used as the argument to +[NSKeyedUnarchiver unarchiveObjectWithData:]. If the NSData can be unarchived as an NSURL, the NSURL is returned otherwise nil is returned.
  • 所以保存被管理对象 ID 只是简单地做为

    1
    2
    NSUserDefaults.standardUserDefaults().setURL(object.objectID.URIRepresentation(),
                                                 forKey:”selected”)

    并检索对象 ID 和对象,例如:

    1
    2
    3
    4
    5
    6
    7
    if let url = NSUserDefaults.standardUserDefaults().URLForKey(“selected”),
        let oid = context.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(url),

        let object = try? context.existingObjectWithID(oid) {

        print(object)
        // …
    }


    有关保存所选设置的替代方法,请参阅上面的评论。

    • 那么如何将 URL/NSData 转换回 NSManagedObject?
    • @Paulw11 已经在对该问题的评论中回答了该问题
    • 谢谢。其实我刚吃完晚饭回来。这就是我这么晚才回复的原因。 :)


    来源:https://www.codenong.com/38953560/

    微信公众号
    手机浏览(小程序)

    Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

    Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

    Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9750.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
    0
    分享到:
    没有账号? 忘记密码?