安裝
第一步:在項(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)勢是對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ù)會丟失骏融。故我們需要把默認(rèn)的數(shù)據(jù)文件放到asset目錄中,當(dāng)數(shù)據(jù)庫初始化時(shí)再copy到"Context.getFilesDir()"下档玻。
2、在創(chuàng)建RealmConfiguration對象時(shí)窃肠,可以通過.assetFile(this,"realm file path in assets")方法指定初始化的數(shù)據(jù)庫文件刷允。Realm會把制定路徑下的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)增長的苹享,需要自己設(shè)置浴麻,做添加的時(shí)候如果不給id字段值,默認(rèn)會為0软免。后面再添加會報(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)建對象和操作對象必須在同一個(gè)線程.
違反了這條會報(bào)錯(cuò):java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.比如我們在UI線程查詢出來的對象, 想要異步地刪除或者更新, 我們必須在新的線程重新查詢.
沒有主鍵自增的功能, 見Issue #469, 需要自己控制主鍵自增.
從List中刪除了一項(xiàng)之后, 最后的一項(xiàng)會移動(dòng)過來補(bǔ)到被刪除的那一項(xiàng)原來的位置. 這是因?yàn)槿思揖褪沁@么設(shè)計(jì)的stackoverflow. 默認(rèn)情況下是沒有排序的, 數(shù)據(jù)按照添加的順序返回, 但是這并不是一種保證, 所以當(dāng)刪除了中間的元素, 后面的會補(bǔ)上這個(gè)位置, 以保證底層的數(shù)據(jù)是放在一起的. 解決辦法就是指定一個(gè)排序規(guī)則.
查詢出來的對象不可以臨時(shí)改變其數(shù)據(jù), 否則會報(bào)錯(cuò):java.lang.IllegalStateException: Changing Realm data can only be done from inside a transaction.
不支持反向link的查詢. (見前面鏈?zhǔn)讲樵儾糠值慕榻B).
不支持級聯(lián)刪除. 即從數(shù)據(jù)庫中刪除一個(gè)對象的時(shí)候, 不會刪除其中RealmObject子類或RealmList類型的字段在數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù).Issue #1104,Issue #2717. 這點(diǎn)也可以理解, 因?yàn)閙odel之間的關(guān)系可能是多對多的. 所以需要實(shí)現(xiàn)級聯(lián)刪除的地方需要手動(dòng)處理.
測試不方便:RealmResults對象即不能被mock也不能被new; 所有的Model對象也不能被mock. 因?yàn)镸ockito can only mock non-private & non-final classes.