为iPhone创建JSON商店

tob*_*ris 7 iphone persistence json store core-data

我们有大量的应用程序,我们从远程Web服务获取数据作为JSON,然后使用解析器将其转换为Core-Data模型.

对于我们的一个应用程序,我认为我们应该做一些不同的事情.

此应用程序具有只读数据,这些数据易失性的,因此不会在本地缓存很长时间.JSON 与大量嵌套的"对象" 密切相关.文档通常包含不超过20个顶级项目,但可能高达100K.

我认为我不想用100个实体创建Core Data模型,然后使用映射器将JSON导入其中.这看起来像是一首歌和舞蹈.我想我只想简单地将JSON保存在某个地方,并且能够查询它.如果它在iPhone上运行,MongoDB会很好.

iPhone上是否有支持查询的JSON文档存储?

或者,我可以使用一些JSON解析器将数据转换为某种持久性NSDictionary并使用谓词进行查询吗?

或者也许使用SQLite作为在JSON结构上手动创建索引的BLOB存储?

或者,我应该停止抱怨,并使用核心数据?:)

帮助赞赏.

Tec*_*Zen 31

在决定使用哪种持久性时,重要的是要记住Core Data首先是对象图管理系统.它的真正功能是创建模型 - 视图 - 控制器设计图案应用程序的运行时模型层.持久性实际上是核心数据的次要甚至可选功能.

主要的建模/持久性问题是数据的大小和数据的复杂性.因此,每种持久性的相对优势和弱点都会像这样崩溃:

    _______________________________
    |               |              |
  2 |               |              |
    |  SQL          |  Core Data   | 4
s   |               |              |
i   |_______________ ______________|
z   |               |              |
e   |               |              |
  1 |  Collection   |  Core Data   | 3
    |  plist/xml    |              |
    |               |              |
    -------------------------------  
              Complexity--->       
Run Code Online (Sandbox Code Playgroud)

我们可以添加第三个出租方维度,即波动性,即数据变化的频率

(1)如果数据的大小,复杂性和波动性低,那么使用集合,例如NSArray,NSDictionary,序列化自定义对象的NSSet将是最佳选择.必须将集合完全读入内存,以限制其有效的持久性大小.它们没有复杂性管理,所有更改都需要重写整个持久性文件.

(2)如果大小非常大但复杂性很低,那么SQL或其他数据库API可以提供卓越的性能.例如旧时尚图书馆索引卡系统.每张卡都是相同的,卡片之间没有任何关系,卡片没有任何行为.SQL或其他过程DB非常擅长处理大量低复杂度信息.如果数据很简单,那么SQL可以有效地处理高度易变的数据.如果UI同样简单,那么将UI集成到iOS/MacOS应用程序的面向对象设计中的开销很小.

(3)随着数据的增长,核心数据越来越复杂."托管对象"的"托管"部分管理关系和行为的复杂性.使用集合或SQL,您可以手动管理复杂性,并且可以发现自己很快就被淹没了.事实上,我看到有人试图用SQL管理复杂数据,最终编写自己的微型核心数据堆栈.毋庸置疑,当您将复杂性与波动性结合起来时,Core Data甚至更好,因为它可以自动处理插入和删除的副作用.

(接口的复杂性也是一个问题.SQL可以处理一个大的,静态的单一表,但是当您添加可以随时更改的表的层次结构时,SQL就变成了一场噩梦.Core Data,NSFetchedResultsController和UITableViewController/delegates使它成为一个噩梦.不重要的.)

(4)Core Data具有高复杂性和高尺寸,显然是最佳选择.核心数据经过高度优化,因此图形大小的增加不会像使用SQL那样陷入困境.您还可以获得高度智能的缓存.

另外,不要混淆"我完全理解SQL而不是核心数据","核心数据的开销很高".它真的没有.即使Core Data不是获取数据进出持久性的最便宜的方式,当您考虑开发速度和可靠性时,它与API其余部分的集成通常会产生出色的结果.

在这种特殊情况下,我无法从描述中看出你是在案例(2)还是案例(4).这取决于数据的内部复杂性和UI的复杂性.你说:

我认为我不想用100个实体创建Core Data模型,然后使用映射器将JSON导入其中.

你的意思是这里的实际抽象实体还是只是托管对象?请记住,实体是托管对象的实例类.如果是前者,那么是核心数据会在前面做很多工作,如果是后者,那么就不会了.您可以使用两个或三个相关实体构建非常大的复杂图形.

还要记住,即使它们在运行时共享一个上下文,您也可以使用配置将不同的实体放入不同的存储中.这可以让您将临时信息放入一个商店,将其用作更持久的数据,然后在完成后删除商店.

核心数据为您提供了比初看起来更明显的选项.

  • 此外,Marcus Zarrus,他真正写了一本关于Core Data的书,提供了以下如何通过动态生成数百个实体来将JSON转换为Core Data和从Core Data转换JSON的示例.我从来没有使用它,但它确实让你知道实现即使是最自由的对象图也是多么容易.http://stackoverflow.com/questions/2362323/json-and-core-data-on-the-iphone (2认同)