realm简单使用

数据库——android四大存储之一,说实话已经很久没有使用了,平时是要使用网络与文件存储,除非是需要离线模式,或者有特殊的要求。realm——一款轻量级的移动端数据库,相比SQLite和其他orm框架有着其许多的优点,以前只是听过,今天来一睹庐山真面目。
相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api(Rx),数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。

如何使用

  1. 依赖
    首先是在project的build.gradle中添加
dependencies {
       ...
        classpath "io.realm:realm-gradle-plugin:2.2.2"
}

然后是app的build.gradle中在apply plugin: 'com.android.application'下面添加

apply plugin: 'realm-android'

现在我们sync project 就可以了。

  1. 创建realm
    我们需要在自定义一个类继承Application
public class AppContext extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RealmConfiguration config = new RealmConfiguration.Builder()
//                .name("myRealm.realm")
                .build();
        Realm.setDefaultConfiguration(config);
    }
}
  • 注释部分为realm的名称,我们使用默认的default.realm。
  • 不要忘记在manifest中使用我们自定义的Application。
  1. 创建RealmObject
    只要继承了RealmObject类,任意JavaBean都能存储在Realm中。
public class RealmBean extends RealmObject {
    private String openId;
    private boolean isRead;

    public String getOpenId() {
        return openId;
    }

    public void setOpenId(String openId) {
        this.openId = openId;
    }

    public boolean isRead() {
        return isRead;
    }

    public void setRead(boolean read) {
        isRead = read;
    }
}
  1. 工具类
    4.1. 插入
public static void insertRealm(String openId) {
   Realm realm = Realm.getDefaultInstance();
   realm.beginTransaction();
   RealmBean bean = realm.createObject(RealmBean.class);
   bean.setOpenId(openId);
   bean.setRead(false);
   realm.commitTransaction();
}

你可能注意到了bean并不是用Country类的构造器创建的。对于一个Realm来说,管理一个RealmObject的实例,这个实例必须用createObject方法创建。
如果你必须使用构造器,别忘了在提交事务前使用相关Realm对象的copyToRealm方法。

public static void insertRealm(String openId) {
    Realm realm = Realm.getDefaultInstance();
    realm.beginTransaction();
    RealmBean bean = new RealmBean();
    bean.setOpenId(openId);
    bean.setRead(false);
    realm.copyToRealm(bean);
    realm.commitTransaction();
}

4.2. 删除

public static RealmBean deleteRealm(String openId) {
    Realm mRealm = Realm.getDefaultInstance();
    RealmBean bean = mRealm.where(RealmBean.class).equalTo("openId", openId).findFirst();
    mRealm.beginTransaction();
    bean.deleteFromRealm();
    mRealm.commitTransaction();
    return bean;
}

4.3. 修改

public static void updateRealm(String openId) {
    Realm mRealm = Realm.getDefaultInstance();
    RealmBean bean = mRealm.where(RealmBean.class).equalTo("openId", openId).findFirst();
    mRealm.beginTransaction();
    bean.setRead(true);
    mRealm.commitTransaction();
}

4.4. 查询

public static RealmBean queryRealm(String openId) {
    Realm mRealm = Realm.getDefaultInstance();
    RealmBean bean = mRealm.where(RealmBean.class).equalTo("openId", openId).findFirst();
    return bean;
}
public static List<RealmBean> queryRealmList(boolean isRead) {
    Realm mRealm = Realm.getDefaultInstance();
    RealmResults<RealmBean> bean = mRealm.where(RealmBean.class).equalTo("isRead", isRead).findAll();
    return bean;
}
  • 条件查询,Realm 支持以下查询条件
    • between()、greaterThan()、lessThan()、greaterThanOrEqualTo() 和 lessThanOrEqualTo()。
    • equalTo() 和 notEqualTo()。
    • contains()、beginsWith() 和 endsWith()。
    • isNull() 和 isNotNull()。
    • isEmpty() 和 isNotEmpty()。

以上就是realm的基本用法,虽然realm简单快捷方便,但还是有许多的短板。

缺点

  • 不是基于sqlite的,他有自己的存储引擎 ,存储不是基于表的,所以联表查询不支持。
  • 所有的数据模型必须直接继承自RealmObject。这阻碍我们利用数据模型中的任意类型的继承。
  • Realm 没有自动增长属性。
  • Realm对象的 Setters & Getters 不能被重载
  • 尽管 Realm 文件可以被多个线程同时访问,但是您不能跨线程处理 Realms、Realm 对象、查询和查询结果。

总结

realm的优点自然不用多说,一个字:快。在保证了ACID的要求下,很多设计都是以速度为主。当然,Realm 最核心的理念就是对象驱动,这是 Realm 的核心原则。Realm 本质上是一个嵌入式数据库,但是它也是看待数据的另一种方式。它用另一种角度来重新看待移动应用中的模型和业务逻辑。
Realm还是跨平台的,多个平台都使用相同的数据库,是多么好的一件事情呀。相信使用Realm作为App数据库的开发者会越来越多。

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

推荐阅读更多精彩内容