2011-03-08 75 views
7

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

对于我们的一个应用程序,我想我们应该做一些不同的事情。

这个程序有只读数据,这是挥发性,因此不是很长本地缓存。 JSON是深层次吨的嵌套“对象”。文件通常包含不超过20个顶级项目,但可能高达100K。

我不认为我想用100个实体创建一个核心数据模型,然后使用映射器将JSON导入它。这就像是一首歌和舞。我想我只想简单地将JSON保留下来,并且有能力查询它。如果在iPhone上运行,MongoDB会很好。

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

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

或者也许使用SQLite作为一个BLOB存储,并在JSON结构上手动创建索引?或者,我应该停止抱怨,并使用核心数据? :)

帮助赞赏。

+0

我在iPad应用程序中使用这种确切的方法。 MonoTouch确实帮助我们把这件事做得更快...... – kwcto 2011-03-08 20:40:02

+0

ifwdev - 很酷,你能解释一下吗?你有没有存储斑点?为什么Monotouch? – tobinharris 2011-03-08 21:53:09

回答

31

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

主要的建模/持久性问题是数据的大小和数据的复杂性。因此,每个类型的持久性的相对优势和劣势会打破这样的:

_______________________________ 
    |    |    | 
    2 |    |    | 
    | SQL   | Core Data | 4 
s |    |    | 
i |_______________ ______________| 
z |    |    | 
e |    |    | 
    1 | Collection | Core Data | 3 
    | plist/xml |    | 
    |    |    | 
    ------------------------------- 
       Complexity--->  

,这是我们可以添加第三出租人尺寸,波动即数据如何变化往往

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

(2)如果大小是非常大的,但复杂性低,则SQL或其他数据库API可以提供优异的性能。例如。一个旧的时尚图书馆索引卡系统。每张卡片是完全相同的,卡片之间没有任何关系,而卡片没有任何行为。 SQL或其他程序DB非常擅长处理大量低复杂度的信息。如果数据很简单,那么SQL可以高效地处理高度不稳定的数据。如果UI同样简单,那么将UI集成到iOS/MacOS应用程序的面向对象设计中的开销很小。 (3)随着数据的增长,更复杂的核心数据迅速变得更加优越。 “管理对象”的“管理”部分管理关系和行为的复杂性。使用集合或SQL,您可以手动管理复杂性并发现自己很快就会陷入困境。事实上,我看到有人试图用SQL处理复杂的数据,最终他们编写了自己的微型核心数据栈。毋庸置疑,当您将复杂性与波动性结合起来时,Core Data会更好,因为它可以自动处理插入和删除的副作用。 SQL可以处理一个大的,静态的奇异表,但是当你添加可以随时改变的表的层次结构时,SQL会变成一场噩梦。核心数据,NSFetchedResultsController和UITableViewController /代表使琐碎。)

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

此外,不要混淆,“我理解SQL彻底而不是核心数据”,与“核心数据有很高的开销。”它确实没有。即使Core Data不是获取数据进出持久性的最便宜方式,但是当您考虑开发速度和可靠性时,与其余API的集成通常会产生出色的结果。

在这种特殊情况下,我无法从描述告诉你是否在情况(2)或情况(4)。这取决于数据的内部复杂性和UI的复杂性。你说:

我不认为我想创建一个实体100的核心 数据模型, 然后使用一个映射到JSON 导入它。

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

也请记住,您可以使用配置,以使不同的实体进入不同的商店,即使他们都有着在运行单个上下文。这可以让您将临时信息放入一个商店,像更持久的数据一样使用它,然后在完成后删除商店。

核心数据为您提供了比乍一看更明显的选项。

+0

感谢您的详细回复,核心数据的优势所在踢出了良好的细分。 是的,我们有100多个实体(类),所以听起来像Core Data会有很多工作。 – tobinharris 2011-03-10 12:18:49

+1

好吧,如果你有100个逻辑上独立的数据块,它们都需要不同的行为,无论如何,这将是很多工作。如果你使用SQL,你需要100个表来存储它们。更可能的是,您实际上只需要一个或几个通用实体,您可以使用这些实体来生成任意复杂度的树结构。 – TechZen 2011-03-10 15:35:10

+0

谢谢。当你说泛型实体时,你的意思是将JSON存储在这些实体中的BLOB中?由于我们提取的JSON包含许多不同的“实体”,因此我不确定使用通用实体创建树结构是什么意思。 – tobinharris 2011-03-10 19:47:08

0

JSON Framework是其中之一。它会将您的JSON转换为本地NSDictionary和NSArray对象。对于像这样的大文档,我对它的性能一无所知,但很多人都喜欢它。这不是iOS的唯一JSON库,但它是一个流行的。

+0

感谢提到,我曾认为这可能是好的! – tobinharris 2011-03-08 21:55:41

4

我使用SBJson来解析JSON到NSDictionaries,然后使用[dict writeToFile:saveFilePath atomically:YES]将它们保存为.plist文件。加载也是如此简单NSMutableDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:saveFilePath]。它的快速,高效和简单。不需要数据库。

+0

谢谢,你知道SBJason与http://code.google.com/p/json-framework/比较吗? – tobinharris 2011-03-09 10:29:35

+0

对不起,延迟的答复 - 这是相同的代码,托宾。我只是把它称为主类名称。 – Hiltmon 2011-03-14 18:41:08