Android Realm 數(shù)據(jù)庫的集成和使用 以及缺點(diǎn)

安裝

第一步:在項(xiàng)目的 build.gradle 文件中添加如下 class path 依賴。

buildscript{repositories{jcenter()}dependencies{classpath"io.realm:realm-gradle-plugin:3.1.2"}

項(xiàng)目的build.gradle文件在如下位置:

第二步:在 app 的 build.gradle 文件中應(yīng)用realm-android插件。

applyplugin:'realm-android'

app的build.gradle文件在如下位置:


使用

Realm數(shù)據(jù)庫的基本增刪查改,跟傳統(tǒng)的數(shù)據(jù)庫一樣,他主要的優(yōu)勢(shì)是對(duì)json數(shù)據(jù)結(jié)構(gòu)的保存

注意事項(xiàng)

1、Realm保存的結(jié)果其實(shí)是在一個(gè)文件里面,默認(rèn)的文件名是"default.realm",在"Context.getFilesDir()"目錄中,即:/data/data//files/default.realm。意思是,當(dāng)你在應(yīng)用管理里面給當(dāng)前app"清除數(shù)據(jù)",realm數(shù)據(jù)庫的數(shù)據(jù)會(huì)丟失。故我們需要把默認(rèn)的數(shù)據(jù)文件放到asset目錄中,當(dāng)數(shù)據(jù)庫初始化時(shí)再copy到"Context.getFilesDir()"下。

2、在創(chuàng)建RealmConfiguration對(duì)象時(shí),可以通過.assetFile(this,"realm file path in assets")方法指定初始化的數(shù)據(jù)庫文件。Realm會(huì)把制定路徑下的xxx.realm文件copy到Context.getFilesDir()目錄中,以替換默認(rèn)創(chuàng)建的空數(shù)據(jù)庫文件。

3、可以設(shè)置默認(rèn)文件名,通過RealmConfiguration類進(jìn)行配置。路徑似乎改不了,需要看具體設(shè)備供應(yīng)商的實(shí)現(xiàn)。

4、Realm的實(shí)例需要在每次的具體操作中獲取,可以看成是一個(gè)數(shù)據(jù)操作的sessin,用完后必須close關(guān)閉。

打開和關(guān)閉Realm實(shí)例,應(yīng)當(dāng)放在onCreate/onDestroy或者onStart/onStop方法中。

5、Realm中似乎有RxJava的影子,支持鏈?zhǔn)疆惒饺蝿?wù)?

6、Realm中有個(gè)各種增刪改差的方法,還可以根據(jù)JSON的數(shù)據(jù)實(shí)例化一個(gè)RealmObject子類java bean。

7、重點(diǎn):切記,Realm數(shù)據(jù)庫的主鍵字段不是自動(dòng)增長(zhǎng)的,需要自己設(shè)置,做添加的時(shí)候如果不給id字段值,默認(rèn)會(huì)為0。后面再添加會(huì)報(bào)錯(cuò),說id為0的數(shù)據(jù)已經(jīng)存在。尤其是批量添加的時(shí)候要注意,當(dāng)心出現(xiàn)只添加了一條記錄的悲劇。

8、數(shù)據(jù)自動(dòng)更新。mRealm.addChangeListener(this);//當(dāng)數(shù)據(jù)庫的數(shù)據(jù)有變化時(shí),系統(tǒng)回調(diào)此方法。


缺點(diǎn)

這里有的也不能說是缺點(diǎn), 只是使用起來覺得不方便的地方.

限制了創(chuàng)建對(duì)象和操作對(duì)象必須在同一個(gè)線程.

違反了這條會(huì)報(bào)錯(cuò):java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.比如我們?cè)赨I線程查詢出來的對(duì)象, 想要異步地刪除或者更新, 我們必須在新的線程重新查詢.

沒有主鍵自增的功能, 見Issue #469, 需要自己控制主鍵自增.

從List中刪除了一項(xiàng)之后, 最后的一項(xiàng)會(huì)移動(dòng)過來補(bǔ)到被刪除的那一項(xiàng)原來的位置. 這是因?yàn)槿思揖褪沁@么設(shè)計(jì)的stackoverflow. 默認(rèn)情況下是沒有排序的, 數(shù)據(jù)按照添加的順序返回, 但是這并不是一種保證, 所以當(dāng)刪除了中間的元素, 后面的會(huì)補(bǔ)上這個(gè)位置, 以保證底層的數(shù)據(jù)是放在一起的. 解決辦法就是指定一個(gè)排序規(guī)則.

查詢出來的對(duì)象不可以臨時(shí)改變其數(shù)據(jù), 否則會(huì)報(bào)錯(cuò):java.lang.IllegalStateException: Changing Realm data can only be done from inside a transaction.

不支持反向link的查詢. (見前面鏈?zhǔn)讲樵儾糠值慕榻B).

不支持級(jí)聯(lián)刪除. 即從數(shù)據(jù)庫中刪除一個(gè)對(duì)象的時(shí)候, 不會(huì)刪除其中RealmObject子類或RealmList類型的字段在數(shù)據(jù)庫中對(duì)應(yīng)的數(shù)據(jù).Issue #1104,Issue #2717. 這點(diǎn)也可以理解, 因?yàn)閙odel之間的關(guān)系可能是多對(duì)多的. 所以需要實(shí)現(xiàn)級(jí)聯(lián)刪除的地方需要手動(dòng)處理.

測(cè)試不方便:RealmResults對(duì)象即不能被mock也不能被new; 所有的Model對(duì)象也不能被mock. 因?yàn)镸ockito can only mock non-private & non-final classes.

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

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

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