成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Realm Java的學(xué)習(xí)、應(yīng)用、總結(jié)

chaosx110 / 714人閱讀

摘要:從珠三角沙龍會議了解到這個(gè)開源庫,然后開始學(xué)習(xí)理解和使用。所以,它的速度相當(dāng)來說比較快的,但是目前它也引發(fā)了應(yīng)用的安裝包大小問題。更多問題可以看官網(wǎng)的工具如果使用,推薦結(jié)合工具進(jìn)行使用。改變的過程總是不那么容易,需要你的堅(jiān)持。

從React Native珠三角沙龍會議了解到Realm這個(gè)開源庫,然后開始學(xué)習(xí)、理解和使用Realm。Realm是跨平臺、支持多種主流語言,這里主要是對Realm Java結(jié)合實(shí)際項(xiàng)目的一些情況進(jìn)行記錄。

Realm是什么?

Realm官網(wǎng):https://realm.io/cn/

Realm,為移動設(shè)備而生!替代 SQLite 和 Core Data。為你省下數(shù)周的時(shí)間和數(shù)千行的代碼,幫你創(chuàng)造出更棒的用戶體驗(yàn)。--Realm官網(wǎng)

從上面官網(wǎng)的定義,我們大概知道它是一個(gè)移動端的數(shù)據(jù)庫。想了解更多到官網(wǎng),在這里不做過長的介紹。

Realm Android的性能

對于Realm Android的性能也是我們比較關(guān)注的一個(gè)問題,我也是看到Realm的性能比其他數(shù)據(jù)庫要快,所以才去了解以及學(xué)習(xí)它。下面從官網(wǎng)的三張圖片來了解一下它的性能。

插入操作:在同一個(gè)事務(wù)里,每秒插入100K條記錄(越高代表性能越好)

統(tǒng)計(jì)操作:每秒能在100K條數(shù)據(jù)中進(jìn)行查詢后count的次數(shù)(越高代表性能越好)

查詢操作:在100K中進(jìn)行一次遍歷查詢(越高代表性能越好)

Realm不是基于SQLite的ORM,它是基于C++ 存儲引擎的。所以,它的速度相當(dāng)來說比較快的,但是目前它也引發(fā)了應(yīng)用的安裝包大小問題。(估計(jì)目前他們正在優(yōu)化這個(gè)問題)
詳細(xì)性能內(nèi)容查看官方的文檔:
https://realm.io/news/realm-for-android/#realm-for-android

為什么選擇Realm Java?

目前在開發(fā)應(yīng)用的IM模塊使用到數(shù)據(jù)庫ormlite存儲數(shù)據(jù)。每次打開應(yīng)用切換到消息列表的時(shí)候要等一會才加載出來,從會話點(diǎn)聊天列表加載聊天記錄(聊天記錄上W條)要轉(zhuǎn)轉(zhuǎn)轉(zhuǎn)轉(zhuǎn)轉(zhuǎn)才出來。看到Realm性能寫得好像好厲害的樣子,所以嘗試運(yùn)用Realm Java。
可能你會問,為什么不選擇DBFlow,GreenDAO,ActiveAndroid?
DBFlow在創(chuàng)建數(shù)據(jù)庫的時(shí)候,數(shù)據(jù)庫名稱和版本號都是使用static final修飾變量,而我的應(yīng)用數(shù)據(jù)庫設(shè)計(jì)是每個(gè)賬號對應(yīng)一個(gè)數(shù)據(jù)庫,所以DBFlow在切換數(shù)據(jù)庫的時(shí)候,有點(diǎn)力不從心,最張放棄使用DBFlow。而GreenDAO性能上也不錯(cuò),但是創(chuàng)建Model和數(shù)據(jù)庫升級挺折騰的,總得來說greenDAO投入成本高。(我比較懶~~),ActiveAndroid沒有嘗試過,有空可以試一下。

Relam Java(v0.91.0)目前遇到的一些問題 Realm Java集成

Realm Java的GitHub地址:https://github.com/realm/realm-java
個(gè)人推薦按照官網(wǎng)文檔集成Realm Java。因?yàn)槲抑鞍凑誈ithub中的文檔集成Realm Java沒有成功,最后按照官網(wǎng)的就可以了。
如果你的項(xiàng)目有多個(gè)Module的話。如下圖,則可以在util的Module加入Realm Java就可以了。

Realm 數(shù)據(jù)庫文件大小

這里我測試了一下引入Realm Java后apk大小的變化。如下圖,可以看到引入后apk足足大了4M。


備注:以下的代碼均運(yùn)行在子線程,這里沒有使用Realm異步查詢。

不支持自增ID

在新增數(shù)據(jù)表的時(shí)候,往往定義自增ID,這樣做是降低與業(yè)務(wù)邏輯的耦合。

//ormlite可以定義自增id
@DatabaseField(generatedId = true)
public int _id;
//realm java 不支持自增id,這里我使用了UUID來生成,我也沒辦法了
//使用我們項(xiàng)目中已經(jīng)使用到id.
public String _id = UUID.randomUUID().toString();
不支持limit

場景:每次找出符合條件的20記錄并返回。
然而,Realm Java沒有這樣的操作。
這個(gè)在github中的issue有人提交了。here
看下面的代碼,我找出所有符合條件的記錄,然后根據(jù)傳入的大小將結(jié)果截取并返回。(Y的,如果記錄上W條的話,不就很坑嗎)

realm.beginTransaction();
String [] orderFiled = {"time","_id"};
Sort [] sorts = {Sort.DESCENDING, Sort.DESCENDING};
RealmResults results = realm.where(Message.class)
    .equalTo("sessionType",  ModelFileds.SESSION_TYPE_MESSAGE_STRANGER)
    .equalTo("sessionId", sessionId)
    .or()
    .equalTo("sessionType", ModelFileds.SESSION_TYPE_MESSAGE_FRIEND)
    .equalTo("sessionId", sessionId)
    .findAllSorted(orderFiled, sorts);
realm.commitTransaction();
return results.subList(0, size);
update操作

場景:找出符合條件的記錄,并對某個(gè)字段進(jìn)行值的修改。

ormlite使用UpdateBuilder就可以完成這個(gè)操作了。

localSqliteHelper = new LocalSqliteHelper(mAccount.getUuid());
UpdateBuilder updateBuilder
     = getMessageDao(localSqliteHelper
.getWritableDatabase()).updateBuilder();
updateBuilder.where()
    .eq("sessionId", sessionId).and()
    .eq("sessionType", sessionType).and()
    .eq("sessionSecondId", sessionSecondId).and()
    .eq("sessionSecondType", sessionSecondType).and()
    .eq("isSend", MessageModel.OTHER_TO_ME);
updateBuilder.updateColumnValue("status", 1);
return updateBuilder.update();

Realm Java我只能這樣寫了。(將符合條件的記錄遍歷賦值,我也無語了)

realm.beginTransaction();
RealmResults messages = realm.where(Message.class)
        .equalTo("sessionId", sessionId)
        .equalTo("sessionType", sessionType)
        .equalTo("sessionSecondId", sessionSecondId)
        .equalTo("sessionSecondType", sessionSecondType)
        .equalTo("isSend", MessageModel.OTHER_TO_ME)
        .findAll();
for (Message msg : messages)
    msg.status = 1;
realm.copyToRealmOrUpdate(messages);
realm.commitTransaction();
like模糊查詢

場景:輸入關(guān)鍵字顯示匹配關(guān)鍵字的記錄。

ormlite使用like就可以了。

LocalSqliteHelper localSqliteHelper = null;
try {
    localSqliteHelper = new LocalSqliteHelper(mAccount.getUuid());
    return getProjectDao(localSqliteHelper.getWritableDatabase())
            .queryBuilder().orderBy("update_date", false)
            .where()
            .like("name", "%/" + keyword + "/%").query();
} catch (SQLException e) {
    throw new DBException(e);
} finally {
    if (localSqliteHelper != null) {
        localSqliteHelper.close();
    }
}

Realm Java先找出符合條件,然后再判斷是否包含關(guān)鍵字。

realm.beginTransaction();
RealmResults results = realm.where(Project.class)
    .findAllSorted("update_date", Sort.DESCENDING);
realm.commitTransaction();
if(results != null && results.size() > 0){
  for(int i = results.size() -1; i >=0; i--){
      if(!results.get(i).name.contains(keyword)){
          results.remove(i);  
      }
  }
}
return results;
FAQ

更多問題可以看官網(wǎng)的FAQ:
https://realm.io/cn/docs/java/latest/#faq

stetho-realm工具

如果使用Realm Java,推薦結(jié)合stetho-realm工具進(jìn)行使用。stetho-realm可以查看Realm數(shù)據(jù),但是這個(gè)工具目前還不支持?jǐn)?shù)據(jù)操作。

擴(kuò)展閱讀

最后,安利大家認(rèn)真閱讀Realm官網(wǎng)發(fā)布的文章。文章有一定的技術(shù)含金量的喔~文章都有中文翻譯的,你再也不用擔(dān)心看不懂!
鏈接:https://realm.io/cn/news/

以前我不太明白大神們說的多看官方文檔、多看源碼這個(gè)學(xué)習(xí)方法,那時(shí)候我總種感覺是他們在忽悠我。以前的我當(dāng)接觸到新的技術(shù)時(shí),第一反應(yīng)是百度,而且非常非常非常討厭看官方文檔(干脆就不看了);現(xiàn)在我總是渴望深入理解它的使用、原理,也慢慢地習(xí)慣閱讀看官方文檔。改變的過程總是不那么容易,需要你的堅(jiān)持。生活何嘗不是需要通過你自己不斷地努力去改變呢~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66031.html

相關(guān)文章

  • Shiro入門這篇就夠了【Shiro基礎(chǔ)知識、回顧URL攔截】

    摘要:細(xì)粒度權(quán)限管理就是數(shù)據(jù)級別的權(quán)限管理。張三只能查看行政部的用戶信息,李四只能查看開發(fā)部門的用戶信息。比如通過的攔截器實(shí)現(xiàn)授權(quán)。 前言 本文主要講解的知識點(diǎn)有以下: 權(quán)限管理的基礎(chǔ)知識 模型 粗粒度和細(xì)粒度的概念 回顧URL攔截的實(shí)現(xiàn) Shiro的介紹與簡單入門 一、Shiro基礎(chǔ)知識 在學(xué)習(xí)Shiro這個(gè)框架之前,首先我們要先了解Shiro需要的基礎(chǔ)知識:權(quán)限管理 1.1什...

    chenjiang3 評論0 收藏0
  • 不用 Spring Security 可否?試試這個(gè)小而美安全框架

    摘要:寫在前面在一款應(yīng)用的整個(gè)生命周期,我們都會談及該應(yīng)用的數(shù)據(jù)安全問題。用戶的合法性與數(shù)據(jù)的可見性是數(shù)據(jù)安全中非常重要的一部分。 寫在前面 在一款應(yīng)用的整個(gè)生命周期,我們都會談及該應(yīng)用的數(shù)據(jù)安全問題。用戶的合法性與數(shù)據(jù)的可見性是數(shù)據(jù)安全中非常重要的一部分。但是,一方面,不同的應(yīng)用對于數(shù)據(jù)的合法性和可見性要求的維度與粒度都有所區(qū)別;另一方面,以當(dāng)前微服務(wù)、多服務(wù)的架構(gòu)方式,如何共享Sessi...

    toddmark 評論0 收藏0

發(fā)表評論

0條評論

chaosx110

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<