数据库框架Realm Java

转载 2016年06月01日 16:25:57

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 Java

引入Realm Java


备注:以下的代码均运行在子线程,这里没有使用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/



文/HanWen(简书作者)
原文链接:http://www.jianshu.com/p/dea5f264fd6f#rd
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

相关文章推荐

Realm Java的学习、应用、总结

从React Native珠三角沙龙会议了解到Realm这个开源库,然后开始学习、理解和使用Realm。Realm是跨平台、支持多种主流语言,这里主要是对Realm Java结合实际项目的一些情况进行...

Android数据库Realm学习(一)基本使用

Realm 是一个移动开源数据库,可运行于手机、平板和可穿戴设备之上。可以让你的应用更快速,带来难以想象的体验。其目标是为了代替 CoreData 和 SQLite 数据库。...

Android Realm数据库完美解析

当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite。 sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型...

Android Realm数据库配合aop框架封装

Android Realm数据库配合aop框架封装Realm数据库的使用
  • ahjxly
  • ahjxly
  • 2017年06月19日 17:13
  • 387

Android数据库框架GreenDao&Realm实战分析

Android开发的童鞋应该都知道,使用官方的SQLite数据库,可以满足我们大部分增删改查的需求,然而随着Android技术的逐步成长,你会慢慢发现SQLite越来越不能满足我们的需求。总结为以下主...

安卓数据库框架——Realm进阶学习

安卓数据库框架——Realm进阶学习 参考: https://realm.io/cn/docs/java/latest/#realms http://ngudream.com/2016/08...

安卓数据库框架——Realm基础学习

安卓数据库框架——Realm学习 参考: http://blog.5ibc.net/p/96511.html http://www.jianshu.com/p/37af717761cc https:...

Realm数据库框架的使用例子

对于android而言数据库非常重要,我们可以使用数据库的开源框架简化自己的数据库的开发过程。其中我比较中意Realm,使用它能够大量减少代码,效率也可观。首先我们来学会如何配置环境 1. 在pr...

Android框架之路——Realm数据库使用

先附上官方Api:https://realm.io/docs/java/latest/参照的一些博客教程: Android Realm Realm for Android详细教程 使用教程:1、 gr...

Realm跨平台 数据库框架,完全摒弃sqlite

转自http://www.jianshu.com/p/cd1684b58 【威哥说】realm是什么?可能很多人都没有听说过,realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objec...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库框架Realm Java
举报原因:
原因补充:

(最多只允许输入30个字)