为iPhone创build一个JSON商店
我们有大量的应用程序,我们从远程Web服务获取数据为JSON,然后使用parsing器将其转换为Core-Data模型。
对于我们的一个应用程序,我想我们应该做一些不同的事情。
这个应用程序具有只读数据 ,这是易失性的 ,因此不会在本地caching很长时间 。 JSON 深深地层叠着大量嵌套的“对象” 。 文件通常包含不超过20个顶级项目,但可能高达100K。
我不认为我想用100个实体创build一个核心数据模型,然后使用映射器将JSON导入到其中。 好像是这样的歌舞。 我想我只想坚持JSON的地方容易,并有能力查询它。 如果在iPhone上运行,MongoDB会很好。
iPhone上是否有支持查询的JSON文档存储?
或者,我可以使用一些JSONparsing器将数据转换为某种持久的NSDictionary,并使用谓词查询?
或者也许使用SQLite作为在JSON结构上手动创build索引的BLOB存储?
或者,我应该停止抱怨,并使用核心数据? 🙂
帮助赞赏。
在决定使用何种持久性时,重要的是要记住,核心数据首先是一个对象图pipe理系统。 它的真正function是创build模型 – 视图 – 控制器devise图案应用程序的运行时模型层。 持久性实际上是核心数据的次要甚至可选function。
主要的build模/持续关注点是数据的大小和数据的复杂性。 所以,每一种持久性的相对优势和弱点都会像这样崩溃:
_______________________________ | | | 2 | | | | SQL | Core Data | 4 s | | | i |_______________ ______________| z | | | e | | | 1 | Collection | Core Data | 3 | plist/xml | | | | | ------------------------------- Complexity--->
为此我们可以增加第三个出租人维度,即波动率,即数据的变化频率
(1)如果数据的大小,复杂性和易变性都很低,那么使用NSArray,NSDictionary,NSSet等序列化自定义对象的集合将是最好的select。 集合必须全部读入内存,以便限制其有效的持久性大小。 他们没有复杂性pipe理,所有的改变都需要重写整个持久性文件。
(2)如果规模非常大但复杂度低,那么SQL或其他数据库API可以提供更好的性能。 例如一个旧的时尚图书馆索引卡系统。 每张卡片都是一样的,卡片之间没有任何关系,卡片也没有任何行为。 SQL或其他过程数据库在处理大量低复杂度信息方面非常擅长。 如果数据很简单,那么SQL可以有效地处理高度不稳定的数据。 如果UI同样简单,那么将UI集成到iOS / MacOS应用程序的面向对象devise中的开销很小。
(3)随着数据越来越复杂,核心数据也越来越优越。 “pipe理对象”的“pipe理”部分pipe理关系和行为的复杂性。 使用集合或SQL,您可以手动pipe理复杂性,并可以快速find自己。 事实上,我看到有人试图用SQL来pipe理复杂的数据,最终他们编写了自己的微型核心数据栈。 毋庸置疑,当您将复杂性与波动性结合在一起时,Core Data就更好了,因为它可以自动处理插入和删除的副作用。
(接口的复杂性也是一个问题,SQL可以处理一个大的,静态的奇异表,但是当你添加表格的层次结构时,SQL会变成一场噩梦。不重要的。)
(4)核心数据复杂度高,体积大,显然是最好的select。 核心数据经过高度优化,因此graphics大小的增加不会像SQL一样陷入困境。 您也获得高度智能的caching。
此外,不要混淆,“我完全理解SQL而不是核心数据”,而“核心数据有很高的开销”。 它确实没有。 即使Core Data不是获取数据的最便宜的方法,但是当考虑到开发速度和可靠性时,与其他API的集成通常会产生出色的结果。
在这种情况下,我不能从描述中看出你是(2)还是情况(4)。 这取决于数据的内部复杂性和UI的复杂性。 你说:
我不认为我想用100个实体创build一个核心数据模型,然后使用映射器将JSON导入到其中。
你是指真正的抽象实体在这里或只是pipe理对象? 请记住,实体是pipe理对象什么类的实例。 如果前者,那么核心数据就会在前面做很多工作,如果是后者,那就不会了。 你可以用两三个相关的实体来构build非常庞大的复杂graphics。
还要记住,即使在运行时共享一个上下文,也可以使用configuration将不同的实体放入不同的存储中。 这可以让您将临时信息放入一个商店,像更持久的数据一样使用它,然后在完成后删除商店。
核心数据给你更多的select乍一看可能是明显的。
我使用SBJsonparsingJSON到NSDictionaries,然后使用[dict writeToFile:saveFilePath atomically:YES]
将它们保存为.plist文件。 加载也一样简单NSMutableDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:saveFilePath]
。 其快速,高效和简单。 不需要数据库。
JSON框架是一个。 它会把你的JSON变成本地的NSDictionary和NSArray对象。 对于像这样的大文档,我对它的性能一无所知,但是很多人都喜欢它。 这不是iOS的唯一JSON库,但它是一个stream行的。