jjzjj

关于ios:如何持久存储一个NSManagedObjectID?

codeneng 2023-03-28 原文

How to store a NSManagedObjectID persistently?

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

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

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

我使用 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。我看到有一个返回 NSURLURIRepresentation() 方法。所以我认为这会起作用:

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 已经在对该问题的评论中回答了该问题
    • 谢谢。其实我刚吃完晚饭回来。这就是我这么晚才回复的原因。 :)

    有关关于ios:如何持久存储一个NSManagedObjectID?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    8. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    10. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    随机推荐