Realm Java的学习、应用、总结
2016-05-24 00:37
501 查看
摘要: 从React Native珠三角沙龙会议了解到Realm这个开源库,然后开始学习、理解和使用Realm。Realm是跨平台、支持多种主流语言,这里主要是对Realm Java结合实际项目的一些情况进行记录。
从React Native珠三角沙龙会议了解到Realm这个开源库,然后开始学习、理解和使用Realm。Realm是跨平台、支持多种主流语言,这里主要是对Realm Java结合实际项目的一些情况进行记录。
Realm,为移动设备而生!替代 SQLite 和 Core Data。为你省下数周的时间和数千行的代码,帮你创造出更棒的用户体验。--Realm官网
从上面官网的定义,我们大概知道它是一个移动端的数据库。想了解更多到官网,在这里不做过长的介绍。
插入操作:在同一个事务里,每秒插入100K条记录(越高代表性能越好)
统计操作:每秒能在100K条数据中进行查询后count的次数(越高代表性能越好)
查询操作:在100K中进行一次遍历查询(越高代表性能越好)
Realm不是基于SQLite的ORM,它是基于C++ 存储引擎的。所以,它的速度相当来说比较快的,但是目前它也引发了应用的安装包大小问题。(估计目前他们正在优化这个问题)
详细性能内容查看官方的文档:
https://realm.io/news/realm-for-android/#realm-for-android
可能你会问,为什么不选择DBFlow,GreenDAO,ActiveAndroid?
DBFlow在创建数据库的时候,数据库名称和版本号都是使用static final修饰变量,而我的应用数据库设计是每个账号对应一个数据库,所以DBFlow在切换数据库的时候,有点力不从心,最张放弃使用DBFlow。而GreenDAO性能上也不错,但是创建Model和数据库升级挺折腾的,总得来说greenDAO投入成本高。(我比较懒~~),ActiveAndroid没有尝试过,有空可以试一下。
个人推荐按照官网文档集成Realm Java。因为我之前按照Github中的文档集成Realm Java没有成功,最后按照官网的就可以了。
如果你的项目有多个Module的话。如下图,则可以在util的Module加入Realm Java就可以了。
备注:以下的代码均运行在子线程,这里没有使用Realm异步查询。
然而,Realm Java没有这样的操作。
这个在github中的issue有人提交了。here
看下面的代码,我找出所有符合条件的记录,然后根据传入的大小将结果截取并返回。(Y的,如果记录上W条的话,不就很坑吗)
ormlite使用UpdateBuilder就可以完成这个操作了。
Realm Java我只能这样写了。(将符合条件的记录遍历赋值,我也无语了)
ormlite使用like就可以了。
Realm Java先找出符合条件,然后再判断是否包含关键字。
https://realm.io/cn/docs/java/latest/#faq
链接:https://realm.io/cn/news/
以前我不太明白大神们说的多看官方文档、多看源码这个学习方法,那时候我总种感觉是他们在忽悠我。以前的我当接触到新的技术时,第一反应是百度,而且非常非常非常讨厌看官方文档(干脆就不看了);现在我总是渴望深入理解它的使用、原理,也慢慢地习惯阅读看官方文档。改变的过程总是不那么容易,需要你的坚持。生活何尝不是需要通过你自己不断地努力去改变呢~
从React Native珠三角沙龙会议了解到Realm这个开源库,然后开始学习、理解和使用Realm。Realm是跨平台、支持多种主流语言,这里主要是对Realm Java结合实际项目的一些情况进行记录。
Realm是什么?
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
为什么选择Realm Java?
目前在开发应用的IM模块使用到数据库ormlite存储数据。每次打开应用切换到消息列表的时候要等一会才加载出来,从会话点聊天列表加载聊天记录(聊天记录上W条)要转转转转转才出来。看到Realm性能写得好像好厉害的样子,所以尝试运用Realm Java。可能你会问,为什么不选择DBFlow,GreenDAO,ActiveAndroid?
DBFlow在创建数据库的时候,数据库名称和版本号都是使用static final修饰变量,而我的应用数据库设计是每个账号对应一个数据库,所以DBFlow在切换数据库的时候,有点力不从心,最张放弃使用DBFlow。而GreenDAO性能上也不错,但是创建Model和数据库升级挺折腾的,总得来说greenDAO投入成本高。(我比较懒~~),ActiveAndroid没有尝试过,有空可以试一下。
Relam Java(v0.91.0)目前遇到的一些问题
Realm Java集成
Realm Java的GitHub地址:https://github.com/realm/realm-java个人推荐按照官网文档集成Realm Java。因为我之前按照Github中的文档集成Realm Java没有成功,最后按照官网的就可以了。
如果你的项目有多个Module的话。如下图,则可以在util的Module加入Realm Java就可以了。
Realm 数据库文件大小
这里我测试了一下引入Realm Java后apk大小的变化。如下图,可以看到引入后apk足足大了4M。备注:以下的代码均运行在子线程,这里没有使用Realm异步查询。
不支持自增ID
在新增数据表的时候,往往定义自增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}; RealmResults<Message> 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操作
场景:找出符合条件的记录,并对某个字段进行值的修改。ormlite使用UpdateBuilder就可以完成这个操作了。
localSqliteHelper = new LocalSqliteHelper(mAccount.getUuid()); UpdateBuilder<MessageModel, Integer> 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<Message> 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模糊查询
场景:输入关键字显示匹配关键字的记录。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(); RealmResults<Project> 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
更多问题可以看官网的FAQ:https://realm.io/cn/docs/java/latest/#faq
stetho-realm工具
如果使用Realm Java,推荐结合stetho-realm工具进行使用。stetho-realm可以查看Realm数据,但是这个工具目前还不支持数据操作。扩展阅读
最后,安利大家认真阅读Realm官网发布的文章。文章有一定的技术含金量的喔~文章都有中文翻译的,你再也不用担心看不懂!链接:https://realm.io/cn/news/
以前我不太明白大神们说的多看官方文档、多看源码这个学习方法,那时候我总种感觉是他们在忽悠我。以前的我当接触到新的技术时,第一反应是百度,而且非常非常非常讨厌看官方文档(干脆就不看了);现在我总是渴望深入理解它的使用、原理,也慢慢地习惯阅读看官方文档。改变的过程总是不那么容易,需要你的坚持。生活何尝不是需要通过你自己不断地努力去改变呢~
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法