摘要:從珠三角沙龍會議了解到這個開源庫,然后開始學習理解和使用。所以,它的速度相當來說比較快的,但是目前它也引發了應用的安裝包大小問題。更多問題可以看官網的工具如果使用,推薦結合工具進行使用。改變的過程總是不那么容易,需要你的堅持。
Realm是什么?從React Native珠三角沙龍會議了解到Realm這個開源庫,然后開始學習、理解和使用Realm。Realm是跨平臺、支持多種主流語言,這里主要是對Realm Java結合實際項目的一些情況進行記錄。
Realm官網:https://realm.io/cn/
Realm,為移動設備而生!替代 SQLite 和 Core Data。為你省下數周的時間和數千行的代碼,幫你創造出更棒的用戶體驗。--Realm官網
從上面官網的定義,我們大概知道它是一個移動端的數據庫。想了解更多到官網,在這里不做過長的介紹。
Realm Android的性能對于Realm Android的性能也是我們比較關注的一個問題,我也是看到Realm的性能比其他數據庫要快,所以才去了解以及學習它。下面從官網的三張圖片來了解一下它的性能。
插入操作:在同一個事務里,每秒插入100K條記錄(越高代表性能越好)
統計操作:每秒能在100K條數據中進行查詢后count的次數(越高代表性能越好)
查詢操作:在100K中進行一次遍歷查詢(越高代表性能越好)
Realm不是基于SQLite的ORM,它是基于C++ 存儲引擎的。所以,它的速度相當來說比較快的,但是目前它也引發了應用的安裝包大小問題。(估計目前他們正在優化這個問題)
詳細性能內容查看官方的文檔:
https://realm.io/news/realm-for-android/#realm-for-android
目前在開發應用的IM模塊使用到數據庫ormlite存儲數據。每次打開應用切換到消息列表的時候要等一會才加載出來,從會話點聊天列表加載聊天記錄(聊天記錄上W條)要轉轉轉轉轉才出來。看到Realm性能寫得好像好厲害的樣子,所以嘗試運用Realm Java。
可能你會問,為什么不選擇DBFlow,GreenDAO,ActiveAndroid?
DBFlow在創建數據庫的時候,數據庫名稱和版本號都是使用static final修飾變量,而我的應用數據庫設計是每個賬號對應一個數據庫,所以DBFlow在切換數據庫的時候,有點力不從心,最張放棄使用DBFlow。而GreenDAO性能上也不錯,但是創建Model和數據庫升級挺折騰的,總得來說greenDAO投入成本高。(我比較懶~~),ActiveAndroid沒有嘗試過,有空可以試一下。
Realm Java的GitHub地址:https://github.com/realm/realm-java
個人推薦按照官網文檔集成Realm Java。因為我之前按照Github中的文檔集成Realm Java沒有成功,最后按照官網的就可以了。
如果你的項目有多個Module的話。如下圖,則可以在util的Module加入Realm Java就可以了。
這里我測試了一下引入Realm Java后apk大小的變化。如下圖,可以看到引入后apk足足大了4M。
備注:以下的代碼均運行在子線程,這里沒有使用Realm異步查詢。
在新增數據表的時候,往往定義自增ID,這樣做是降低與業務邏輯的耦合。
//ormlite可以定義自增id @DatabaseField(generatedId = true) public int _id;
//realm java 不支持自增id,這里我使用了UUID來生成,我也沒辦法了 //使用我們項目中已經使用到id. public String _id = UUID.randomUUID().toString();不支持limit
場景:每次找出符合條件的20記錄并返回。
然而,Realm Java沒有這樣的操作。
這個在github中的issue有人提交了。here
看下面的代碼,我找出所有符合條件的記錄,然后根據傳入的大小將結果截取并返回。(Y的,如果記錄上W條的話,不就很坑嗎)
realm.beginTransaction(); String [] orderFiled = {"time","_id"}; Sort [] sorts = {Sort.DESCENDING, Sort.DESCENDING}; RealmResultsupdate操作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);
場景:找出符合條件的記錄,并對某個字段進行值的修改。
ormlite使用UpdateBuilder就可以完成這個操作了。
localSqliteHelper = new LocalSqliteHelper(mAccount.getUuid()); UpdateBuilderupdateBuilder = 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(); RealmResultslike模糊查詢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();
場景:輸入關鍵字顯示匹配關鍵字的記錄。
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先找出符合條件,然后再判斷是否包含關鍵字。
realm.beginTransaction(); RealmResultsFAQresults = 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:
https://realm.io/cn/docs/java/latest/#faq
如果使用Realm Java,推薦結合stetho-realm工具進行使用。stetho-realm可以查看Realm數據,但是這個工具目前還不支持數據操作。
擴展閱讀最后,安利大家認真閱讀Realm官網發布的文章。文章有一定的技術含金量的喔~文章都有中文翻譯的,你再也不用擔心看不懂!
鏈接:https://realm.io/cn/news/
以前我不太明白大神們說的多看官方文檔、多看源碼這個學習方法,那時候我總種感覺是他們在忽悠我。以前的我當接觸到新的技術時,第一反應是百度,而且非常非常非常討厭看官方文檔(干脆就不看了);現在我總是渴望深入理解它的使用、原理,也慢慢地習慣閱讀看官方文檔。改變的過程總是不那么容易,需要你的堅持。生活何嘗不是需要通過你自己不斷地努力去改變呢~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66031.html
摘要:細粒度權限管理就是數據級別的權限管理。張三只能查看行政部的用戶信息,李四只能查看開發部門的用戶信息。比如通過的攔截器實現授權。 前言 本文主要講解的知識點有以下: 權限管理的基礎知識 模型 粗粒度和細粒度的概念 回顧URL攔截的實現 Shiro的介紹與簡單入門 一、Shiro基礎知識 在學習Shiro這個框架之前,首先我們要先了解Shiro需要的基礎知識:權限管理 1.1什...
摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...
閱讀 370·2023-04-25 16:38
閱讀 1482·2021-09-26 09:46
閱讀 3326·2021-09-08 09:35
閱讀 2779·2019-08-30 12:54
閱讀 3249·2019-08-29 17:06
閱讀 1017·2019-08-29 14:06
閱讀 3344·2019-08-29 13:00
閱讀 3466·2019-08-28 17:53