从React Native珠三角沙龙会议了解到Realm这个开源库,而后开始学习、理解和使用Realm。Realm是跨平台、支持多种主流语言,这里主要是对Realm Java结合实际项目的一些状况进行记录。java
Realm官网:https://realm.io/cn/android
Realm,为移动设备而生!替代 SQLite 和 Core Data。为你省下数周的时间和数千行的代码,帮你创造出更棒的用户体验。--Realm官网git
从上面官网的定义,咱们大概知道它是一个移动端的数据库。想了解更多到官网,在这里不作过长的介绍。github
对于Realm Android的性能也是咱们比较关注的一个问题,我也是看到Realm的性能比其余数据库要快,因此才去了解以及学习它。下面从官网的三张图片来了解一下它的性能。数据库
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,这样作是下降与业务逻辑的耦合。
1 //ormlite能够定义自增id 2 @DatabaseField(generatedId = true) 3 public int _id;
1 //realm java 不支持自增id,这里我使用了UUID来生成,我也没办法了 2 //使用咱们项目中已经使用到id. 3 public String _id = UUID.randomUUID().toString();
场景:每次找出符合条件的20记录并返回。 然而,Realm Java没有这样的操做。
这个在github中的issue有人提交了。here 看下面的代码,我找出全部符合条件的记录,而后根据传入的大小将结果截取并返回。(Y的,若是记录上W条的话,不就很坑吗)
1 realm.beginTransaction(); 2 String [] orderFiled = {"time","_id"}; 3 Sort [] sorts = {Sort.DESCENDING, Sort.DESCENDING}; 4 RealmResults<Message> results = realm.where(Message.class) 5 .equalTo("sessionType", ModelFileds.SESSION_TYPE_MESSAGE_STRANGER) 6 .equalTo("sessionId", sessionId) 7 .or() 8 .equalTo("sessionType", ModelFileds.SESSION_TYPE_MESSAGE_FRIEND) 9 .equalTo("sessionId", sessionId) 10 .findAllSorted(orderFiled, sorts); 11 realm.commitTransaction(); 12 return results.subList(0, size);
场景:找出符合条件的记录,并对某个字段进行值的修改。
1 localSqliteHelper = new LocalSqliteHelper(mAccount.getUuid()); 2 UpdateBuilder<MessageModel, Integer> updateBuilder 3 = getMessageDao(localSqliteHelper 4 .getWritableDatabase()).updateBuilder(); 5 updateBuilder.where() 6 .eq("sessionId", sessionId).and() 7 .eq("sessionType", sessionType).and() 8 .eq("sessionSecondId", sessionSecondId).and() 9 .eq("sessionSecondType", sessionSecondType).and() 10 .eq("isSend", MessageModel.OTHER_TO_ME); 11 updateBuilder.updateColumnValue("status", 1); 12 return updateBuilder.update();
1 realm.beginTransaction(); 2 RealmResults<Message> messages = realm.where(Message.class) 3 .equalTo("sessionId", sessionId) 4 .equalTo("sessionType", sessionType) 5 .equalTo("sessionSecondId", sessionSecondId) 6 .equalTo("sessionSecondType", sessionSecondType) 7 .equalTo("isSend", MessageModel.OTHER_TO_ME) 8 .findAll(); 9 for (Message msg : messages) 10 msg.status = 1; 11 realm.copyToRealmOrUpdate(messages); 12 realm.commitTransaction();
场景:输入关键字显示匹配关键字的记录。
1 LocalSqliteHelper localSqliteHelper = null; 2 try { 3 localSqliteHelper = new LocalSqliteHelper(mAccount.getUuid()); 4 return getProjectDao(localSqliteHelper.getWritableDatabase()) 5 .queryBuilder().orderBy("update_date", false) 6 .where() 7 .like("name", "%/" + keyword + "/%").query(); 8 } catch (SQLException e) { 9 throw new DBException(e); 10 } finally { 11 if (localSqliteHelper != null) { 12 localSqliteHelper.close(); 13 } 14 }
1 realm.beginTransaction(); 2 RealmResults<Project> results = realm.where(Project.class) 3 .findAllSorted("update_date", Sort.DESCENDING); 4 realm.commitTransaction(); 5 if(results != null && results.size() > 0){ 6 for(int i = results.size() -1; i >=0; i--){ 7 if(!results.get(i).name.contains(keyword)){ 8 results.remove(i); 9 } 10 } 11 } 12 return results;
更多问题能够看官网的FAQ: https://realm.io/cn/docs/java/latest/#faq
若是使用Realm Java,推荐结合stetho-realm工具进行使用。stetho-realm能够查看Realm数据,可是这个工具目前还不支持数据操做。
最后,安利你们认真阅读Realm官网发布的文章。文章有必定的技术含金量的喔~文章都有中文翻译的,你不再用担忧看不懂! 连接:https://realm.io/cn/news/
之前我不太明白大神们说的多看官方文档、多看源码这个学习方法,那时候我总种感受是他们在忽悠我。之前的我当接触到新的技术时,第一反应是百度,并且很是很是很是讨厌看官方文档(干脆就不看了);如今我老是渴望深刻理解它的使用、原理,也慢慢地习惯阅读看官方文档。改变的过程老是不那么容易,须要你的坚持。生活未尝不是须要经过你本身不断地努力去改变呢~