Realm的了解

2018-07-20  本文已影响0人  霸道_强哥

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

6>参考资料

深入理解 Realm 的多线程处理机制

Realm官方文档

raywenderlick的RealmTutorial

上一篇下一篇

猜你喜欢

热点阅读