您好,欢迎来到花图问答。
搜索
您的当前位置:首页Realm Java的学习、应用、总结

Realm Java的学习、应用、总结

来源:花图问答

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

Realm是什么?

Realm,为移动设备而生!替代 SQLite 和 Core Data。为你省下数周的时间和数千行的代码,帮你创造出更棒的用户体验。--Realm官网

从上面官网的定义,我们大概知道它是一个移动端的数据库。想了解更多到官网,在这里不做过长的介绍。

Realm Android的性能

对于Realm Android的性能也是我们比较关注的一个问题,我也是看到Realm的性能比其他数据库要快,所以才去了解以及学习它。下面从官网的三张图片来了解一下它的性能。

  • 插入操作:在同一个事务里,每秒插入100K条记录(越高代表性能越好)


    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

    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);
    
    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);
    
    

    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);
    
    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

    stetho-realm工具

    扩展阅读


    以前我不太明白大神们说的多看官方文档、多看源码这个学习方法,那时候我总种感觉是他们在忽悠我。以前的我当接触到新的技术时,第一反应是百度,而且非常非常非常讨厌看官方文档(干脆就不看了);现在我总是渴望深入理解它的使用、原理,也慢慢地习惯阅读看官方文档。改变的过程总是不那么容易,需要你的坚持。生活何尝不是需要通过你自己不断地努力去改变呢~

Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务