No SQL, Realm轻量级,现代化数据库入门

subtitle: "让你的应用迅速带上存储的翅膀

  • 简介

Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库。相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。

准确来说,它是专门为移动应用所设计的数据持久化解决方案之一。

Realm 可以轻松地移植到您的项目当中,并且绝大部分常用的功能(比如说插入、查询等等)都可以用一行简单的代码轻松完成!

Realm 并不是对 Core Data 的简单封装,相反地, Realm 并不是基于 Core Data ,也不是基于 SQLite 所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。

  • 优点

  • 跨平台 :现在绝大多数的应用开发并不仅仅只在 iOS 平台上进行开发,还要兼顾到 Android 平台的开发。为两个平台设计不同的数据库是愚蠢的,而使用 Realm 数据库, iOS 和 Android 无需考虑内部数据的架构,调用 Realm 提供的 API 就可以完成数据的交换,实现 “ 一个数据库,两个平台无缝衔接 ” 。

  • 简单易用 : Core Data 和 SQLite 冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用 Realm ,则可以极大地减少学习代价和学习时间,让应用及早用上数据存储功能。

  • 可视化 : Realm 还提供了一个轻量级的数据库查看工具,借助这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。毕竟,很多时候,开发者使用数据库的理由是因为要提供一些所谓的 “ 知识库 ” 。

  • 使用

CURD操作
Realm规定所有改动操作必须在事务中进行, 即改动操作必须在Realm的beginTransaction()和commitTransaction()方法之间进行 或者在executeTransaction方法的参数的回调中执行. 改动操作有: createObject/copyXxx/insert/deleteXxx 等

引入

dependencies {
    compile 'io.realm:realm-android:0.87.0'
}
  • 初始化

        /*初始化*/
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
                .name("test1.realm")// 存储文件名称,类似db文件名
                .migration(new RealmMigration() { // 当本地已经存在的数据版本跟当前运行的不一致会调用此方法
                    @Override
                    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
                        newVersion = oldVersion + 1;
                    }
                })
                .build();
        final Realm myRealm = Realm.getInstance(realmConfiguration);// 设置配置
  • 类的定义

我们定义的类,必须继承于RealmObject。看下我们定义的Person类

加了@PrimaryKey 的为主键,当然,我们也可以不加


public class Person extends RealmObject {

    @PrimaryKey               
    private int id;
    private String name;
    private int age;

    public Person() {
    }

    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 getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}
  • 清空表

//清空表
        myRealm.beginTransaction();
        myRealm.clear(Person.class);
        myRealm.commitTransaction();
       //两种添加方式
        myRealm.beginTransaction();
        Person person = myRealm.createObject(Person.class);
        person.setId(10);
        person.setAge(10);
        person.setName("xiamin");
        myRealm.commitTransaction();    //有主键的表,这种操作要是主键重复了可是会报异常的

        person = new Person();
        person.setId(13);
        person.setAge(13);
        person.setName("xiamin");

        myRealm.beginTransaction();
        myRealm.copyToRealmOrUpdate(person);  // 若是没有主键的表,则不能执行该操作哦 通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替。
        myRealm.commitTransaction();
        //删
        Log.i("xiamin", "删除第一个");
        final RealmResults<Person> list=  myRealm.where(Person.class).findAll();
        myRealm.beginTransaction();
        list.get(0).removeFromRealm();
        myRealm.commitTransaction();
        //改
        Log.i("xiamin", "修改age = 7的名字为xiamin2");
        myRealm.beginTransaction();
        person = myRealm.where(Person.class).equalTo("age",7).findFirst();
        person.setName("xiamin2");
        myRealm.commitTransaction();

        //查 + 排序
        Log.i("xiamin", "查询结果");
        RealmResults<Person> results =
        myRealm.where(Person.class).findAllSorted("age");
        for (Person s: results) {
            Log.i("xiamin", "id:" + s.getId() + " name:" + s.getName() + " age:" + s.getAge());
        }

常见的条件如下(详细资料请查官方文档):

between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()

equalTo() & notEqualTo()

contains(), beginsWith() & endsWith()

isNull() & isNotNull()

isEmpty() & isNotEmpty()

常见问题

  • A RealmObject with no @PrimaryKey cannot be updated: class com.jerey.realmdemo.Person
    一个没有主键的类是不使用copyToRealmOrUpdate的

  • Android Realm: Primary key constraint broken. Value already exists: 0
    有主键的类,主键重复了

  • the xxx RealmMigration must be provided
    出现这个问题的时候是因为,没有初始化时没有提供migration

  • 没有在beginTransaction();与commitTransaction(); 就进行了事物修改等


谢谢大家阅读,如有帮助,来个喜欢或者关注吧!


本文作者:Anderson/Jerey_Jobs

博客地址 : 夏敏的博客/Anderson大码渣/Jerey_Jobs

简书地址 : Anderson大码渣

CSDN地址 : Jerey_Jobs的专栏

github地址 : Jerey_Jobs

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容