<轉(zhuǎn)>CoreData VS Realm

原文鏈接
http://iiiyu.com/2016/01/19/CoreData-VS-Realm/?utm_source=tuicool&utm_medium=referral
本文具有強(qiáng)烈的個(gè)人感情色彩,如有觀看不適,請盡快關(guān)閉。本文僅作為個(gè)人學(xué)習(xí)記錄使用,也歡迎在許可協(xié)議范圍內(nèi)轉(zhuǎn)載或使用,請尊重版權(quán)并且保留原文鏈接,謝謝您的理解合作。如果您覺得本站對您能有幫助,您可以使用RSS方式訂閱本站,這樣您將能在第一時(shí)間獲取本站信息。
碎碎念
OhMyStar 2 也進(jìn)行了一段時(shí)日,我把持久化的方式從CoreData 換到了 Realm。有些感悟,順手就記錄一下吧。以下評論都是自己很主觀的感受,無實(shí)際測試數(shù)據(jù)支持。
論 iOS 的持久化
iOS 持久化其實(shí)也沒多少選擇, 高端一點(diǎn)CoreData、Realm、FMDB、KV類(LevelDB等)。低端一些直接一個(gè) NSArray 就寫成 Plist 也能持久化下來。
在網(wǎng)絡(luò)環(huán)境越來越快的當(dāng)下和大部分應(yīng)用數(shù)據(jù)都可能是網(wǎng)絡(luò)應(yīng)用,如果業(yè)務(wù)邏輯并不復(fù)雜,其實(shí)極端一點(diǎn)就只用寫到 JSON 轉(zhuǎn) Object 就好了。而且一堆這樣好用的封裝,遠(yuǎn)有Mantle 近有YYModel
所以需要持久化的時(shí)候,我覺的可以慎重的評估一下需求。想明白了,后面可以節(jié)省很多事情。
本文章主要對比 Realm 和 CoreData,其他的就不涉及了。
Realm
優(yōu)點(diǎn)
入門門檻低
Realm文檔就算一個(gè)字一個(gè)字扣著讀完,一個(gè)下午就足夠了。而且還有中文版本,不要太友好哦,有點(diǎn)不習(xí)慣誒。
文檔覆蓋了80%的使用情況,甚至有些太簡陋的嫌疑。但不管怎么樣,這種入門條件比起 CoreData 寫了三個(gè)月都沒搞清楚 Context 要好的多。
在庫的工具鏈上,安裝一個(gè) Realm Browser 以后就不需要其他輔助了。還是簡單。
幾乎做到了上手即用的程度。五星好評。
PS:我用了一個(gè)通宵把 OhMyStar 2 的持久化從 CoreData 換到了 Realm ,優(yōu)化調(diào)整了大概5天左右達(dá)到勉強(qiáng)可以用的情況 。在這之前并沒有任何 Realm 的經(jīng)驗(yàn)。
據(jù)說性能好一些
Realm官方介紹Fast一段中
Counts

Counts
Queries
Queries
Queries
Queries
Inserts
Inserts
Inserts
Inserts
在寫這里的時(shí)候我順手Google了一下 發(fā)現(xiàn)一篇Core Data, FMDB, Realm 性能測試。我就多說幾句
總覺得大家對 CoreData 誤會蠻深,代碼 Fork 看了一下, 總覺得不應(yīng)該這樣寫來比性能的,但是一時(shí)半會也不知道怎么改。我只能說我在優(yōu)化 CoreData 的時(shí)候根據(jù) WWDC 上教的還是提升很高,另外一個(gè)事情是 CoreData 一般都用 Sqlite 做后端。所以如果你的查詢是經(jīng)過優(yōu)化的,確認(rèn)打出來的SQL語句科學(xué)以后,Sqlite(CoreData) 跟 Sqlite(FMDB)我覺得性能就算有差距,這差距沒有能大到選擇方案的決定性因素。如果使用 CoreData 遇到性能瓶頸,你應(yīng)該仔細(xì)的研究 WWDC 和幾篇很好的文章。確保你的 CoreData 使用方式是正確科學(xué)的。
沒有需要架構(gòu)Context那種煩人的東西
應(yīng)該也算Realm簡單的一個(gè)方面,Realm 只要保持自己線程里面,自己的 Realm Store 操作是正確的即可。如果是 CoreData,怎么架構(gòu)一個(gè)科學(xué)的 Context Stack 就足夠讓我頭疼一整,iOS 還好,界面是一個(gè)接著一個(gè)(VC跟VC之間的層級關(guān)系很清晰)。而 OhMyStar 2 這種 OS X 桌面應(yīng)用場景VC之間很復(fù)雜,線程之間Context的關(guān)系讓出現(xiàn)很多問題。
支持 NSPredicate
從 CoreData 轉(zhuǎn)過來并沒有太多的不適應(yīng)
很簡單的使用多個(gè)存儲文件
舉個(gè)例子,多用戶登陸情況下。用戶是單獨(dú)的存儲文件,和全部用戶使用同一個(gè)存儲文件。后者需要每條用戶數(shù)據(jù)都要關(guān)聯(lián)一次當(dāng)前用戶,所有查詢用戶數(shù)據(jù)的時(shí)候,你都必須加上當(dāng)前用戶的查詢項(xiàng)。而使用每個(gè)用戶單獨(dú)一個(gè)數(shù)據(jù)文件的時(shí)候,整個(gè)存儲結(jié)構(gòu)會清爽很多。
技術(shù)支持
至少實(shí)在沒法的時(shí)候還可以去微博上吐槽他們,他們其實(shí)也有極大的熱情來解決你遇到的問題。CoreData 這種遇到問題就只能自己默默的吞下。
細(xì)?;ㄖ?(2016-02-23更新 0.98.x 版本以后可以獲得精細(xì)化通知)
看最新的文檔已經(jīng)更新:
Notifications
看例子還可以進(jìn)行filter。不要太友好哦。。。我很不習(xí)慣的。
有了這個(gè)通知在我思考的程序結(jié)構(gòu)里,寫入數(shù)據(jù)的所有線程都可以在后臺了,而且更新UI的時(shí)候只用在需要的地方監(jiān)聽需要的類。這個(gè)進(jìn)步讓之前的缺點(diǎn)瞬間變成了優(yōu)點(diǎn),太棒了
缺點(diǎn)
關(guān)聯(lián)關(guān)系弱的一逼
簡單說來就是對象跟對象之間的一對多關(guān)系和多對多關(guān)系。并不能映射,需要在雙方里面都寫上屬性,此外還需要在設(shè)置的時(shí)候兩邊同時(shí)設(shè)置。查詢時(shí)候也是 NSPredicate 也僅僅只支持一些一層的查詢,沒法做出帶SUBQUERY的復(fù)雜查詢出來。
強(qiáng)制內(nèi)省容錯機(jī)制導(dǎo)致存儲文件不斷變大
Realm本身感覺有一個(gè)數(shù)據(jù)容錯機(jī)制。但是這個(gè)機(jī)制在數(shù)據(jù)庫文件有錯誤的情況自己修復(fù)的時(shí)候,會無限增大。具體我這里表現(xiàn)為,打開看只有3000條數(shù)據(jù),但是文件大小已經(jīng)有3GB。重現(xiàn)Bug也很容易,只要你在寫數(shù)據(jù)庫的時(shí)候,用Realm Browser查看一下,crash之后在打開就很容易出現(xiàn)。
官方文檔里面有說到會造成這種情形的原因,我在盡我所能的避免問題以后。存儲文件還是會有可能不那么夸張的變大一些。但是用Realm Browser查看數(shù)據(jù)是正常的。所以我覺得官方應(yīng)該提供一個(gè)函數(shù),可以刪除掉那些容易的東西。保持存儲文件的干凈。
2016-02-23更新: 樓下Realm的同學(xué)留言說了其中一種解決方法??梢允褂肦ealm.writeCopyToPath()
來手動釋放舊版本使用的空間。當(dāng)然這些空間在沒有 Realm 實(shí)例引用的情況下是會被自動重用的。我理解的意思是在開啟或者關(guān)閉App的時(shí)刻,把Realm實(shí)際的數(shù)據(jù)庫寫到tmp里再把當(dāng)前的realm關(guān)閉然后拷貝回來。會變大的原因肯定還是線程的問題。 我的被我寫的有些亂,期望我能把他優(yōu)化好吧。
沒有細(xì)粒化通知
也就是說,當(dāng)我在某個(gè)地方做出修改。 我其他地方只知道Realm有修改,但是沒法知道我是增加、修改還是刪除了數(shù)據(jù)。不知道我更新的是那一條數(shù)據(jù)。據(jù)文檔說,將來會解決這個(gè)問題,就只有拭目以待。
增加包體積
據(jù)官方說會增加1MB左右的包大小,如果你是一個(gè)小體積應(yīng)用,或者是一個(gè)幾千萬用戶的主流應(yīng)用。對包大小敏感的話慎用。
2016-02-23更新:實(shí)際測試我在Mac上的adhoc包有3MB多。
核心代碼目前閉源
對于在我們這樣一個(gè)作惡滿天飛的天朝長大的孩子來說,有些孩子對閉源這個(gè)事情還是挺在意的。不過官方說將來會開源,我還是傾向于相信 Realm 他們的人品。
CoreData
CoreData 相關(guān)資料相對多一些我就簡單說
優(yōu)點(diǎn)
官方支持 && 親兒子
系統(tǒng)自帶,Apple支持
帶圖形化的Model編輯
對于視覺化動物來說比較友好,也可以清楚的知道自己設(shè)計(jì)的 Model 之間的關(guān)系
強(qiáng)大的關(guān)聯(lián)關(guān)系
以前不覺得,用了 Realm 才發(fā)現(xiàn) CoreData 的關(guān)聯(lián)關(guān)系如此好用,一對多,多對多。想怎么查詢就怎么查詢,可以寫出很復(fù)雜的查詢邏輯來。
強(qiáng)大的查詢
雖然可能在設(shè)置NSFetchRequest的時(shí)候感覺很多東西要弄,但是復(fù)雜也帶來了強(qiáng)大的功能,NSFetchRequest 可以設(shè)置很多,比如限制查詢數(shù)量, 限制只返回某些屬性值等等。就不展開說了。
精細(xì)化的通知
可以知道具體插入了什么、更新了什么、刪除了什么。這樣在刷UI,比如一個(gè)tableview的時(shí)候,你就可以控制的很準(zhǔn)確。
缺點(diǎn)
入門門檻高
CoreData 是一個(gè)博大精深的技術(shù),不要妄想幾天之內(nèi)可以用的很溜。CoreData 是一個(gè)博大精深的技術(shù),不要妄想幾天之內(nèi)可以用的很溜。CoreData 是一個(gè)博大精深的技術(shù),不要妄想幾天之內(nèi)可以用的很溜。
如果沒有足夠的時(shí)間和精力去接入 CoreData。 那選型的時(shí)候應(yīng)當(dāng)慎重考慮。
需要一些工具才感覺好使
不管是老手還是新手,使用一些第三方的封裝庫和工具都會大大的提高使用 CoreData 的幸福指數(shù)。
mogenerator 是必須必須要的。
MagicalRecord 無愧 CoreData 第一庫,據(jù)小道消息 主要貢獻(xiàn)者 Saul Mora 可能去了微信了。
Context
其實(shí)還是 CoreData 門檻高的問題,對我來說。Context之間的關(guān)系和線程之間的處理讓我感到很頭痛,特別是 OS X 是一大堆VC鋪到屏幕上,我水平又菜,出的問題很多。
多個(gè)持久化文件很麻煩
不是說不可以,但是真的好麻煩。
有個(gè)第三方庫有解決CoreData這個(gè)問題 CoreStore 但是我用著不是很順手最后棄用.
總結(jié)
其實(shí)吧用啥持久化都行,具體還是需要看你的需求和方案上來說哪一個(gè)方案更加適合。
如果簡單說來,就是 Realm 更加適合一些業(yè)務(wù)邏輯不怎么復(fù)雜的場景,團(tuán)隊(duì)配置要求不高,有經(jīng)驗(yàn)的人稍微看一下午就能上手。
CoreData 更加適合業(yè)務(wù)邏輯復(fù)雜的情況,團(tuán)隊(duì)配置要求比較高,有經(jīng)驗(yàn)的老手也需要幾周甚至更長的時(shí)間才能科學(xué)的使用CoreData。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容