关闭

Realm技术选型初体验

1391人阅读 评论(2) 收藏 举报
分类:

Realm

Realm 是一个 MVCC (多版本并发控制)数据库,由Y Combinator公司在2014年7月发布一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库,目标是取代SQLite。
Realm 本质上是一个嵌入式数据库,他并不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。和SQLite不同,它允许你在持久层直接和数据对象工作。在它之上是一个函数式风格的查询api,众多的努力让它比传统的SQLite 操作更快

查看官网介绍:https://realm.io/cn/

Realm的优点

  • 简单易用
  • 速度快
  • 跨平台
  • 高级功能
  • 可视化
  • 开源

接入

根目录build.gradle进行以下配置:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        ...

        classpath "io.realm:realm-gradle-plugin:3.1.1"

        ...
    }
}

工程目录build.gradle依赖插件:

apply plugin: 'realm-android'

Application类onCreate方法进行初始化:

public class RealmApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
    }
}

实操

获取Ream实例

   public static Realm newRealmInstance() {
        return Realm.getInstance(new RealmConfiguration.Builder()
                .deleteRealmIfMigrationNeeded()
                .name(RealmHelper.DB_NAME)
                .build());
    }

声明实体

**
 * User Model.
 *
 * 也可以使用@RealmClass注解来生命数据模型,比如:
 *
 * @RealmClass
    public class User implements RealmModel {
    ...
    }
 *
 * @author devilwwj
 * @since 2017/6/16
 */
public class User extends RealmObject {
    // 主键唯一
    @PrimaryKey
    private String name;
    private int age;

    // 属性忽略,意味着此字段可以不被存储到数据库中
    @Ignore
    private int sessionId;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSessionId() {
        return sessionId;
    }

    public void setSessionId(int sessionId) {
        this.sessionId = sessionId;
    }
}

必须继承RealmObject.

写操作

    realm.beginTransaction();
    User user = realm.createObject(User.class); // 创建一个新的对象
    user.setName("John");
    user.setEmail("john@corporation.com");
    realm.commitTransaction();           

不想手动处理事务?使用以下方式:

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        User user = realm.createObject(User.class);
        user.setName("John");
        user.setEmail("john@corporation.com");
    }
});

想异步处理事务?使用以下方式:

realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                User user = bgRealm.createObject(User.class);
                user.setName("John");
                user.setEmail("john@corporation.com");
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                // 事物成功完成
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                // 事物失败,自动取消
            }
        });

查操作

// 创建一个RealmQuery用于查找所有符合条件的user
RealmQuery<User> query = realm.where(User.class);
// 添加查询条件
query.equalTo("name", "John");
query.or().equalTo("name", "Peter");
// 执行查询
RealmResults<User> result1 = query.findAll();
// 或者进行简化
RealmResults<User> result2 = realm.where(User.class)
                                  .equalTo("name", "John")
                                  .or()
                                  .equalTo("name", "Peter")
                                  .findAll();

改操作

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Dog myPuppy = realm.where(Dog.class).equalTo("age", 1).findFirst();
        myPuppy.setAge(2);
    }
});

删操作

// 获取查询结果
final RealmResults<Dog> results = realm.where(Dog.class).findAll();
// 所有对数据的变更必须在事物中进行
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        // 移除符合条件的单个查询结果
        results.deleteFirstFromRealm();
        results.deleteLastFromRealm();
        // 移除单个对象
        Dog dog = results.get(5);
        dog.deleteFromRealm();
        // 移除所有符合条件的查询结果
        results.deleteAllFromRealm();
    }
});

以上就是Realm的CRUD基本用法,第一次使用确实被惊艳了,很简单易用啊,符合技术选型的一个要求。

除了简单易用,它有没有一些我们不知道的坑,必须有啊,具体看下以下这篇文章:

说说 Realm 在 Android 上的坑

指明了realm有以下缺点:

  • 线程的限制(realm对象只能被创建它的线程中访问,不能随意切换)
  • 数据类型(RealmList没有实现Serializable接口,不能通过intent直接传值)
  • 数据库版本迁移问题(需要关注实体类的变更,这。。)
  • 其实还有增加包大小的问题(可以通过split abi来减少包大小)

总结

本篇文章,只是粗略了介绍了Realm的用法,还需要更加深入去使用才能决定是否使用到项目中,在技术选型中,除了简单易用还要考虑是否适合自己的场景,
就好像男生追求女生一样,尽管对方很优秀,但彼此并不适合,那就还是不要在一起了,因为你们不会幸(xing)福的,瞎扯了一下,感谢你的阅读。

参考资料

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Realm数据库使用教程(一):Realm配置和Stetho配置

本人主要是开发android项目的,这里只对android端Realm使用进行总结。对于Realm的优缺点,既然你要使用了,就说明你有一定的了解,在这里就不介绍了!如果需要可自行googleRealm官方文档:https://realm.io/docs/java/latest/ 数据库效率对比 分别...
  • huangxiaoguo1
  • huangxiaoguo1
  • 2017-12-20 11:32
  • 1670

在Android中使用Realm作本地存储

在Android中使用Realm作本地存储
  • u013651026
  • u013651026
  • 2017-12-19 13:09
  • 103

Realm For Android详细教程

目录 1、Realm简介 2、环境配置 3、在Application中初始化Realm 4、创建实体 5、增删改查 6、异步操作 7、Demo地址(https://github.com/RaphetS/DemoRealm ) Demo地址:https://git...
  • chenli_001
  • chenli_001
  • 2017-09-08 15:31
  • 146

Realm for Android 使用入门

Realm 是一个手机数据库,是用来替代 SQlite 的解决方案,比 SQlite 更轻量级,速度更快,因为它有一套自己的数据库搜索引擎,并且还具有很多现代数据库的优点,支持 JSON,流式 API 调用,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已经支持...
  • u012426327
  • u012426327
  • 2017-09-15 16:06
  • 92

Realm使用简介

参考: 官方文档:https://realm.io/docs/java/latest/#installation API:https://realm.io/docs/java/latest/api/1.在Android项目下面的第一级build.gradle文件中添加依赖classpath &q...
  • u010378579
  • u010378579
  • 2016-11-05 16:45
  • 434

移动端数据库神器-Realm 项目配置(入门一)

Realm是一个用来替代sqlite的解决方案,它比sqlite更轻量,同时速度更快,而且使用起来很简单顺手,还跨平台,目前已支持Java,Objective C,Swift,React-Native,Xamarin这五种语言。本篇博客以Android语言为基础,带大家一起探索realm的神奇之处。...
  • zengxyuyu
  • zengxyuyu
  • 2017-05-13 14:54
  • 660

Gradle各版本下载地址

Gradle各版本下载地址:http://services.gradle.org/distributions/ 我们下载都是all版本,里面包含了Gradle SDK的所有相关内容,包括:源码、文档、示例等。 下载之后进行解压,我们可以得到如下目录清单: docs----A...
  • hanfengzqh
  • hanfengzqh
  • 2017-10-09 17:32
  • 3050

Android Realm数据库的使用

数据库在我们的开发过程中用的很多,从Android原生的Sqlite,到后来的ORMLite、GreenDao等数据库框架,数据库的效率要求越来越高,现在Realm正成为一款很火的高效轻量级框架。先看Android环境下的配置1.首先要在Project一级的build.gradle添加如下配置bui...
  • StevenDuan17
  • StevenDuan17
  • 2016-12-26 18:06
  • 260

Android数据库新王者-Realm入门教程

好长时间没有写关于Android方面的学习文章了,今天给大家带来的是堪称是一个可以替代SQLite以及ORMlibraries的轻量级数据库—Realm移动端数据库。相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开...
  • u010046908
  • u010046908
  • 2016-06-10 23:23
  • 2590

Android windows+chrome 查看Realm数据库

StethoStetho是Facebook出品的一个非常强大的Android调试工具。 启用后,开发人员可以使用Chrome浏览器的Chrome开发者工具功能。 开发人员还可以选择启用可选的dumpapp工具,它为应用程序内部提供了强大的命令行界面。 Stetho可以监听网络请求,从而快速调试和分...
  • qq402164452
  • qq402164452
  • 2017-01-07 19:54
  • 3873
    个人资料
    • 访问:4980299次
    • 积分:44055
    • 等级:
    • 排名:第91名
    • 原创:659篇
    • 转载:80篇
    • 译文:3篇
    • 评论:2754条
    博客专栏
    尽情骚扰我

    微信公众号:wwjblog

    微信号:whatswwj


    移动开发者狂热群:注明入群理由,里面有一群热爱分享的开发者
    • Q群:299402133
    • QQ号:659982592

    高品质课堂推荐:http://stay4it.com


    最新评论
    【程序员的成长路线图】
    从入门到成长到成熟再到优秀,大多数程序员走了前面一段相似的道路,而有些人却走得更远一些!!!!