Realm數(shù)據(jù)庫使用總結(jié)及采坑記錄

版權(quán)聲明:本文來自 Crocutax 的博客 , 轉(zhuǎn)載請注明出處 http://www.crocutax.com

Realm使用注意事項(xiàng)

  • Realm默認(rèn)運(yùn)行在主線程,使用時須開啟異步任務(wù)
  • Realm本身是單例類,可以多線程并發(fā)調(diào)用,但是RealmObject則不允許并發(fā),每個RealmObject都綁定了一個TreadId,必須在創(chuàng)建該RealmObject的線程中使用它.
  • 在子線程查詢出的數(shù)據(jù)無法在主線程使用,自己的方案是:子線程查詢,置換為自己的Bean類,然后在主線程使用
  • 沒有主鍵的realmObject無法進(jìn)行update操作.所以如果要使用realm.copyToRealmOrUpdate(realmObject),那么這個realmObject必須設(shè)置primaryKey
  • 如果Realm關(guān)閉决乎,所有查詢得到的RealmObject都不能使用了,解決方案是復(fù)制一份數(shù)據(jù)到內(nèi)存中峡捡。
  • 操作數(shù)據(jù)庫必須在transaction中完成

常見問題

Object not managed by Realm, so it cannot be removed

Realm不支持直接通過deleteFromRealm刪除Bean類,即使該Bean extends RealmObject今艺,否則會報此異常

正確姿勢:

根據(jù)指定字段,從數(shù)據(jù)庫中查詢到該Bean枝秤,然后再刪除

/**
 * 從數(shù)據(jù)庫中刪除CollectBean
 * @param conType
 * @param relateId
 */
public void deleteCollectBeanByTypeAndId(String conType,int relateId){
    Realm realm = RealmUtils.getInstance().mRealm;
    CollectBean bean = realm.where(CollectBean.class)
            .equalTo(CollectBean.CON_TYPE, conType)
            .equalTo(CollectBean.RELATE_ID,relateId)
            .findFirst();
    realm.beginTransaction();
    bean.deleteFromRealm();
    realm.commitTransaction();
}

Realm accessed from incorrect thread

RealmObject自帶線程保護(hù)功能,只能在創(chuàng)建它的線程中訪問戈稿,在子線程中不能訪問猾浦。
也就是說,如果你在主線程中new了一個RealmObject對象 user魄揉,那么在子線程中是訪問不了user對象的剪侮。
要想在子線程中訪問,必須先將user存入Ream中,然后在子線程中query出來瓣俯。
簡書文章

is not part of the schema for this Realm

詳細(xì)異常信息: java.lang.IllegalArgumentException: UserBean is not part of the schema for this Realm

需要調(diào)整plugin中的順序,如下:

apply plugin: 'com.android.application'
apply plugin: 'com.bugtags.library.plugin'
apply plugin: 'android-apt'
apply plugin: 'realm-android'
apply plugin: 'com.neenbedankt.android-apt'

{bean}has a primary key, use 'createObject(Class<E>, Object)' instead

詳細(xì)異常信息: io.realm.exceptions.RealmException: 'UserBean' has a primary key, use 'createObject(Class<E>, Object)' instead.

如果實(shí)體中已經(jīng)通過@PrimaryKey標(biāo)明了主鍵,那么想要通過createObject(Class<E>, Object)創(chuàng)建實(shí)體對象,則必須傳入primaryKeyValue(主鍵值)

異步查詢之坑

1.官方文檔介紹 主線程操作Realm會卡頓/阻塞線程

防止ANR

官方表示Realm運(yùn)行速度很快,足以在主線程運(yùn)行,而后又表示其實(shí)還是會阻塞線程導(dǎo)致偶發(fā)的ANR,因此建議在子線程操作Realm.

2.子線程查詢的數(shù)據(jù),無法在主線程使用

image.png

解決方案:

子線程查詢,置換為自己的Bean類,然后在主線程使用.

Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Person ziPerson = realm.where(Person.class).findFirst();
        personInfo = new PersonInfo();
        personInfo.setName(ziPerson.getName());
        personInfo.setAge(ziPerson.getAge());
        //Log 輸出#Execute ] false..Person{name='小明', age=18}
        KLog.i((Looper.getMainLooper()==Looper.myLooper())+".."+ personInfo.toString());
    }
}, new Realm.Transaction.OnSuccess() {
    @Override
    public void onSuccess() {
        //Log 輸出#OnSuccess ] true..personInfo:Person{name='小明', age=18}
        KLog.i((Looper.getMainLooper()==Looper.myLooper())+".."+ personInfo.toString());
    }
}, new Realm.Transaction.OnError() {
    @Override
    public void onError(Throwable error) {
        KLog.i(error.toString());
    }
});

RejectedExecutionException

詳細(xì)異常信息: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@4dffbdd rejected from io.realm.internal.async.RealmThreadPoolExecutor@c09c352[Running, pool size = 17, active threads = 2, queued tasks = 100, completed tasks = 110]

解決方案:

不要在for循環(huán)中使用Realm,將數(shù)據(jù)存入集合中,然后開啟事務(wù),直接使用copyToRealmOrUpdate(realmObjectList)存儲即可.

事務(wù)嵌套報異常

詳細(xì)異常信息: The Realm is already in a write transaction in /Users/blakemeike/Working/release/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 116

原因 : 在一個事務(wù)中開啟了另外一個事務(wù).應(yīng)避免這種情況.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杰标,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彩匕,更是在濱河造成了極大的恐慌腔剂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驼仪,死亡現(xiàn)場離奇詭異掸犬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绪爸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門湾碎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毡泻,你說我怎么就攤上這事胜茧。” “怎么了仇味?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵呻顽,是天一觀的道長。 經(jīng)常有香客問我丹墨,道長廊遍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任贩挣,我火速辦了婚禮喉前,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘王财。我一直安慰自己卵迂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布绒净。 她就那樣靜靜地躺著见咒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挂疆。 梳的紋絲不亂的頭發(fā)上改览,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音缤言,去河邊找鬼宝当。 笑死,一個胖子當(dāng)著我的面吹牛胆萧,可吹牛的內(nèi)容都是我干的庆揩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盾鳞!你這毒婦竟也來了犬性?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤腾仅,失蹤者是張志新(化名)和其女友劉穎乒裆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推励,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹤耍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了验辞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿黄。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跌造,靈堂內(nèi)的尸體忽然破棺而出杆怕,到底是詐尸還是另有隱情,我是刑警寧澤壳贪,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布陵珍,位于F島的核電站,受9級特大地震影響违施,放射性物質(zhì)發(fā)生泄漏互纯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一磕蒲、第九天 我趴在偏房一處隱蔽的房頂上張望留潦。 院中可真熱鬧,春花似錦辣往、人聲如沸兔院。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坊萝。三九已至,卻和暖如春钻哩,著一層夾襖步出監(jiān)牢的瞬間屹堰,已是汗流浹背肛冶。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工街氢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睦袖。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓珊肃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伦乔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Realm是由Y Combinator公司孵化出來的一款可以用于iOS(同樣適用于Swift&Objective-...
    小歪子go閱讀 2,227評論 6 9
  • 跨平臺:現(xiàn)在很多應(yīng)用都是要兼顧iOS和Android兩個平臺同時開發(fā)厉亏。如果兩個平臺都能使用相同的數(shù)據(jù)庫,那就不用考...
    CoderZS閱讀 2,492評論 2 16
  • 前言 由于最近項(xiàng)目中在用Realm烈和,所以把自己實(shí)踐過程中的一些心得總結(jié)分享一下爱只。 Realm是由Y Combina...
    一縷殤流化隱半邊冰霜閱讀 73,078評論 213 517
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)招刹,斷路器恬试,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1.媽媽每次都會記住我說過的要求,只不過是幾天前說的去買些面包做早餐疯暑,結(jié)果她就去買了训柴,想到自己每次都苦著臉對她,實(shí)...
    南山的羊閱讀 87評論 0 1