Realm的了解
1>Realm架构
Realm是一个移动端数据库,专门针对移动APP设计,不仅适用于iOS,也适用于Android,目前最新版本是1.0.2,我这用的是0.9.8版本。它底层并不依赖SQLite,有自己的一套存储引擎。官网地址https://realm.io/cn/,有非常详细的中文文档,也支持CocoaPods,所以在项目中只要在Podfile中加入Realm然后pod install就行。以下代码描述都是针对iOS,其他语言请参照官方文档。
Realm是一个类MVCC数据库,每个连接的线程在特定的时刻都有一个数据库的快照。MVCC在设计上采用了和Git一样的源文件管理算法,也就是说你的每个连接线程就好比在一个分支(也就是数据库的快照)上工作,但是你并没有得到一个完整的数据库拷贝。Realm和一些真正的MVCC数据库如MySQL是不同的,Real在某个时刻只能有一个写操作,且总是操作最新的数据版本,不能在老版本操作。
2>Realm,多线程混合使用
零拷贝架构也使得Realm可以自动更新对象和查询。在一个查询中更新对象,在另外一个查询中可以马上读取到更新的内容。多线程同时更新数据也是一样,可以即时更新对象的内容。正是因为对象的自动更新,所以Realm中也是不允许多线程之间的对象共享,因为如果多线程共享Realm对象,会导致数据的不一致性,虽然通过加锁是可以保证数据一致性的,但是会增加开销。
因此,在使用Realm的时候,不要在多个线程之间共享对象。如果要在另外一个线程获取同样的数据,请重新执行查询。多线程更新数据的操作后面会有例子演示。
3>Realm的几个基本类型
Realm Objective-C支持的数据类型有BOOL、bool、int、NSInteger、long、long long、float、double、NSString、NSDate、NSData 以及 被特殊类型标记的 NSNumber,注意:Realm不支持auto_increment类型。Realm中涉及的几个类和概念如下:
RLMRealm
这是Realm数据库框架的核心,它是一个访问底层数据库的指针,有点类似CoreData中的ManagedObjectContext对象。在代码中可以通过[RLMRealm defaultRealm]获取。
RLMObject
这是Realm的对象模型。自己定义的对象要继承该类,然后可以定义自己的属性。也可以定义主键(覆写+ (NSString *)primaryKey方法)和索引(覆写+ (NSArray *)indexedProperties方法)等。
4> 总结
1.涉及数据更新的操作必须在transactionWithBlock中完成(或者用
[realm beginWriteTransaction]和[realm commitWriteTransaction])。
2.注意一对多关系中的协议的宏定义以及反向链接中的变量定义。
3.多线程不能共享Realm对象。多线程调用transactionWithBlock更新数据时,后调用的线程会阻塞直到前一个线程完成数据更新,如果是查询数据则不受影响。
3.一个线程的transacWithBlock如果没有执行完成,则数据更新并没有写到磁盘上,因此这个时候在其他线程中看到的数据还是它的快照版本,并不是新的数据。见多线程例子。
5>代码
本文示例的代码地址:
https://github.com/shishujuan/ios_study/tree/master/realm/RealmStart
参考资料3的Objective-C实现的代码地址:
https://github.com/shishujuan/ios_study/tree/master/realm/RealmDemo