API简单,光速上手(然后光速踩坑,APP狂闪不止)。这个确实是小团队福音,不需要学习曲线陡峭的CoreData,甚至不用写sql,大家简单阅读下文档,就可以在实际项目中开用了。升级、迁移等都有非常成熟的接口。
性能优秀。简单看过原理,相比于传统数据库 链接 - 查询 - 命中 - 内存拷贝 - 对象序列化 的复杂过程,Realm采用基于内存映射的Zero-Copy技术,速度快一个数量级。而且内部采用了类似git的对象版本管理机制,并发的性能和安全性也不错。
响应式。Realm的查询结果是随数据库变化实时更新的(要求对象在Run Loop线程中),配合KVO或者Realm自带的ObjectNotification,可以轻松构建及时反映数据变化的响应式UI,这点和目前主流的响应式框架(ReactNative,ReactiveCocoa)应该是天作之和了。但是要求使用者改变思路,不然会出现很多诡异的bug。
ORM。虽然Realm自己号称是『为移动开发者定制的全功能数据库』,但是其中确实包含ORM的很多特性,不用手动写中间层了,取出来就是新鲜活泼的对象,everyone is happy。
再说说坑:
无法多线程共享数据库对象。这是Realm设计的要求,跨线程访问的话,只能自己重新query出来。前面说的上手快,踩坑也快,就是因为这个:异步的Block、网络接口的回调、从不同线程发出的通知都会触发这个访问异常。最关键的还是思维方式的转换,Realm其实是要求尽量减少object的传递,虽然是ORM,但毕竟还是是个数据库,该query的地方,还是不要偷懒。
数据库对象管理。这里有很多坑,比如访问一个被删除的对象时,会直接异常;数据库被close后,所有查询出的object都无法使用;修改被管理对象属性,必须在指定block或者数据库事物集中完成,相当于入库,但是一般的对象又没有关系(两者看起来没有任何区别)等等等等。
对业务代码的侵蚀严重。所有的的数据库对象要继承指定的类(没法继承自己的基类了),增删改查,对查询结果处理都有特殊的语法要求,这使得在旧项目中引入Realm或者放弃使用将Realm从项目中剥离都面临很大的成本。
静态库大,还在不断更新。引入这样一个三方静态库会增加App体积,目测大了1M至少了。另外Realm目前还不是很稳定,之前测试ObjectNotification功能,居然会出现偶尔拿不到回调的bug,相比于成熟的sqlite方案,还不是很放心。
总体来说,Realm还是一个值得尝试的存储方案,个人非常看好 Realm + Swift + reactiveCocoa或者Realm + ReactNative的组合,总感觉和Objective-C八字不合。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)