1>Realm架構(gòu)
Realm是一個移動端數(shù)據(jù)庫,專門針對移動APP設(shè)計睹耐,不僅適用于iOS,也適用于Android部翘,目前最新版本是1.0.2赎瑰,我這用的是0.9.8版本除抛。它底層并不依賴SQLite,有自己的一套存儲引擎肮之。官網(wǎng)地址https://realm.io/cn/刮刑,有非常詳細的中文文檔挡逼,也支持CocoaPods污抬,所以在項目中只要在Podfile中加入Realm然后pod install就行沐悦。以下代碼描述都是針對iOS,其他語言請參照官方文檔崔兴。
Realm是一個類MVCC數(shù)據(jù)庫,每個連接的線程在特定的時刻都有一個數(shù)據(jù)庫的快照蛔翅。MVCC在設(shè)計上采用了和Git一樣的源文件管理算法敲茄,也就是說你的每個連接線程就好比在一個分支(也就是數(shù)據(jù)庫的快照)上工作,但是你并沒有得到一個完整的數(shù)據(jù)庫拷貝山析。Realm和一些真正的MVCC數(shù)據(jù)庫如MySQL是不同的堰燎,Real在某個時刻只能有一個寫操作,且總是操作最新的數(shù)據(jù)版本笋轨,不能在老版本操作秆剪。
?2>Realm,多線程混合使用
零拷貝架構(gòu)也使得Realm可以自動更新對象和查詢。在一個查詢中更新對象爵政,在另外一個查詢中可以馬上讀取到更新的內(nèi)容仅讽。多線程同時更新數(shù)據(jù)也是一樣,可以即時更新對象的內(nèi)容钾挟。正是因為對象的自動更新洁灵,所以Realm中也是不允許多線程之間的對象共享,因為如果多線程共享Realm對象掺出,會導(dǎo)致數(shù)據(jù)的不一致性徽千,雖然通過加鎖是可以保證數(shù)據(jù)一致性的,但是會增加開銷汤锨。
因此双抽,在使用Realm的時候,不要在多個線程之間共享對象闲礼。如果要在另外一個線程獲取同樣的數(shù)據(jù)牍汹,請重新執(zhí)行查詢铐维。多線程更新數(shù)據(jù)的操作后面會有例子演示。
3>Realm的幾個基本類型
Realm Objective-C支持的數(shù)據(jù)類型有BOOL柑贞、bool方椎、int、NSInteger钧嘶、long棠众、long long、float有决、double闸拿、NSString、NSDate书幕、NSData 以及 被特殊類型標記的 NSNumber新荤,注意:Realm不支持auto_increment類型。Realm中涉及的幾個類和概念如下:
RLMRealm
這是Realm數(shù)據(jù)庫框架的核心台汇,它是一個訪問底層數(shù)據(jù)庫的指針苛骨,有點類似CoreData中的ManagedObjectContext對象。在代碼中可以通過[RLMRealm defaultRealm]獲取苟呐。
RLMObject
這是Realm的對象模型痒芝。自己定義的對象要繼承該類,然后可以定義自己的屬性牵素。也可以定義主鍵(覆寫+ (NSString *)primaryKey方法)和索引(覆寫+ (NSArray *)indexedProperties方法)等严衬。
4>?總結(jié)
1.涉及數(shù)據(jù)更新的操作必須在transactionWithBlock中完成(或者用
[realm beginWriteTransaction]和[realm commitWriteTransaction])。
2.注意一對多關(guān)系中的協(xié)議的宏定義以及反向鏈接中的變量定義笆呆。
3.多線程不能共享Realm對象请琳。多線程調(diào)用transactionWithBlock更新數(shù)據(jù)時,后調(diào)用的線程會阻塞直到前一個線程完成數(shù)據(jù)更新赠幕,如果是查詢數(shù)據(jù)則不受影響俄精。
3.一個線程的transacWithBlock如果沒有執(zhí)行完成,則數(shù)據(jù)更新并沒有寫到磁盤上劣坊,因此這個時候在其他線程中看到的數(shù)據(jù)還是它的快照版本嘀倒,并不是新的數(shù)據(jù)。見多線程例子局冰。
5>代碼
本文示例的代碼地址:
https://github.com/shishujuan/ios_study/tree/master/realm/RealmStart
參考資料3的Objective-C實現(xiàn)的代碼地址:
https://github.com/shishujuan/ios_study/tree/master/realm/RealmDemo