iOS 开发如果涉及数据和表的持久化,Core Data 比 SQLite 更好吗?

一直用coreData解决, 我觉得这样效率高,再说coredata也有数据缓存机制. 我不会Sqllite. 感觉纯粹的SQLlite完全被coreData弱化了.这样不妥吗?

第一层:
这两个东西我都用过,两者都能实现对数据库的操作,功能上需求都能满足。
先前在公司实习的时候,原先项目中用的是SQLite,感觉操作很直接。如果先前有一点数据库和SQL基础的话,写起来会感觉很亲切,都是一些数据库操作的语句。但是当操作变多之后,语句越来越多,就很烦,代码比较多,看起来也会混乱一些。
后来新项目中尝试了CoreData,因为苹果一直在推这个东西。CoreData用起来比直接sql语句方便许多,而且很适合进行代码封装、重构。其实后来在用CoreData的时候,参照RestKit的ObjectMapping和CoreData部分对其进行了少量封装,使得CoreData用起来非常方便。例如:添加一条User数据
User *user = [User object];
user.name = @"example";
[objectStore save];
后来做开发一直都在用CoreData,主要是我觉得用起来太方便了,代码能够精简许多。另外,
  • App升级之后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作还是麻烦一些。
  • CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。
  • CoreData并不是直接操纵数据库,比如:使用CoreData时不能设置数据库的主键,目前仍需要手动操作。
  • 效率上其实跑程序时感觉不出来,毕竟手机上的数据不能跟网站的数据和访问量相提并论。

总的来说,个人比较喜欢用CoreData,因为自己比较熟悉,使用起来也非常方便。
PS:既然你一直在CoreData,就应该坚持用下去,除非是真的碰到很致命的无法解决问题。中途换掉既有的自己熟悉的东西,费时费力,实际用起来没区别,得不偿失。

第二层:
首先,coredata和sqlite的概念不同,core为对象周期管理,而sqlite为dbms。
下面的讨论以使用core data来做数据持久化并使用sqlite做backend存储的情况为前提。
  1. 使用方便性。实际上,一个成熟的工程中一定是对数据持久化进行了封装的,因此底层使用的到底是core data还是sqlite,不应该被业务逻辑开发者关心。因此,即使习惯写SQL查询的人,也应该避免在业务逻辑中直接编写SQL语句。
  2. 存储性能,在写入性能上,因为都是使用的sqlite格式作为磁盘存储格式,因此其性能是一样的,如果你觉得用core data写的慢,很可能是你用sqlite的时候写的每条数据的内容没有core data时多,或者是你批量写入的时候每写入一条就调用了一次save。
  3. 查询性能,core data因为要兼容多种后端格式,因此查询时,其可用的语句比直接使用sqlite少,因此有些fetch实际上不是在sqlite中执行的。但这样未必会降低查询效率。因为iPhone的flash memory速度还是很快的。我的经验是大部分时候,在内存不是很紧张时,直接fetch一个entity的所有数据然后在内存中做filter往往比使用predicate在fetch时过滤更快。如果你觉的查询慢,很可能是查询方式有问题,可以把core data的debug模式打开,看一下到底执行了多少SQL语句,相信其中大部分是可以通过改写core data的调用方式避免的。
  4. core data的一个比较大的痛点是多人合作开发的时候,管理coredata的模型需要很小心,尤其是合并的时候,他的data model是XML格式的,手动resolve比较烦心。
  5. core data还有其他sql所不具备的优点,比如对undo的支持,多个context实现sketchbook类似的功能。为ManagedObject优化的row cash等。
  6. 另外core data是支持多线程的,但需要thread confinement的方式实现,使用了多线程之后可以最大化的防止阻塞主线程。
第三层:
1.如果你的项目规模比较大,用coreData 可以减少你对存储管理的很多工作,否则你可能需要自己写很多的数据模型倒数据库操作的代码。
2.你的数据结构变化,数据迁移的时候coreData能帮你自动的完成,用sqlite 你就需要自己写代码来完成。
3.coreData还有些其他效率方面的优化,比如延迟写入。

对我自己而言,一般来说,如果没有复杂的 查询 需求,而数据量又比较小的话,我会用文件来做存储,自我感觉比较干净。如果涉及到比较多的数据,但是结构比较单一,表比较少,逻辑比较简单用sqlite也不错,但是如果你的表比较多,操作也比较多,还有升级迁移的需求,推荐使用coreData吧。

第四层:
我以前的公司有自己的针对iphone的sqlite处理库(我自己开发的=w=),操作简单,功能比较完整,连数据迁移的功能都有,而且也有针对公司业务的具体情况。所以完全没有动力用coredata。

我记得我面试公司的时候老板问我(原本是想做JAVA的),“关于Hibernate,你觉得它的好处是什么?”。我很快就将标准答案答出来了,无非就是说数据处理的对象化。然后他接着问,为什么要将数据处理对象化。我大概说,因为这样可以加强代码的统一性等等。当时我是毕业生,并不明白他的用意,后来我知道了。在很多开发,这种代码的性质上的统一可能真的不是特别 实际。

我们公司做的程序有个特点,就是数据库版本更新特别多。最多纪录是半年内对一个app的数据库进行各种更新合共将近30次。此外还有其他一些特点:
为避免防止断电,程序出错、退出等各种状况造成数据不完整,每次数据有任何微小变动都要进行数据库写入,不过更重要的其实是直接用SQLite更新数据所动用的运算太少了,所以即使每次变动都更新问题都不大,倒也不是真的要做的万无一失。
数据量庞大而且增速快。每次日常基准操作大概会造成200-500条数据插入。一天大概要进行2-5次基准操作。这些操作会上传到服务器,而其他用户也能通过服务器下载,所以数据库里很容易看到某个表出现几十万条数据。
这种业务内容coredata其实是比较难以应付的。

当年老板告诉我他对对象化处理数据持久的看法。简单概括是“不灵活”。这也是我现在对CoreData的想法。

我举个例子吧,譬如说数据迁移,数据库的表格要变动了,这在CoreData的处理还是太过繁琐。而用我们公司的库,这仅仅是加入一个xml文件,里面存储了几条更新数据库的SQL而已。无论是删表还是加列加表都相当方便。xml有自己的版本,程序在启动的时候会检查数据库的版本和xml的版本而决定是否执行相关的SQL。这种做法带来的另外一个好处是,数据库的变动很容易追踪。CoreData的Model虽然直观,但其实比起那几条SQL,说实在,你能一下看出两个xml的SQL到底对数据库做了什么修改,但你未必能一眼看出两个CoreData的Model有什么不同。30个放一起,你想追踪这半年来你的数据库的变动,用CoreData的话会非常痛苦。

再有一个例子,像前面所说的,某个表已经有几十万个数据,然后要为这个表做些修改,譬如增加一个列,而列中的数据是基于其他表和这个表的一些数据进行初始化。CoreData要处理这种业务就相当困难。原本CoreData是要防止程序中加入太多数据处理代码,这种情况下CoreData反而因为不够灵活而必须涉及很多数据代码,这样的对象化数据处理真的有必要吗?相比之下SQL要处理这些问题可谓手到擒来。

但无论如何,我现在正在学用CoreData,主要是因为CoreData毕竟有它合适的地方。对于很多App来说,我们公司的那种App那样的数据业务状况是不常见的,CoreData在这个情况下还是比较方便的。毕竟不是每个公司都像我以前的公司那样构造一个完整的SQLite处理库,CoreData在这种情况下也算是一种通用语言。不过我必须说,CoreData用起来还是不够灵活。





你可能感兴趣的:(iOS 开发如果涉及数据和表的持久化,Core Data 比 SQLite 更好吗?)