在Android加入和使用Realm

原文链接:Up and Running With Realm for Android

介绍

如果你比较关心android开发的最新动态的话,那么你肯定会听说过Realm,Realm是一个轻量级的数据库,在Android开发中,它可以替代SQLiteORM框架。

和SQLite相比,Realm速度更快并且它有很多先进的特性,例如对JSON的支持,流畅的API,数据变化通知(观察者),加密支持… 所有的这一切都会让android开发者日子过得更潇洒(这里扯淡了,开发者日子怎么可能潇洒,当然也可能是国内外不同…)。

这篇文章的主题就是Realm for Android, 在这篇文章中,我将使用Realm v0.84.1

将Realm添加到项目

要在Android项目中使用Realm, 你需要在module的build.gradle文件中添加如下代码:

compile ‘io.realm:realm-android:0.84.1‘

创建一个Realm

一个Realm和SQLite比较类似。它有一个文件和他作为关联,这个文件一次创建,就会永久存在Android系统中。

想要创建一个Realm, 你可以在任意一个Activity中调用静态方法Realm.getInstance

Realm myRealm = Realm.getInstance(context);

需要注意的是,我们这样创建,没有给它指定RealmConfiguration,这时候创建的文件会使用默认的文件名default.realm

如果你需要创建另外一个Realm,那你就必须要给它传递RealmConfiguration.Builder了,并且要给它指定一个唯一的名称。

Realm myOtherRealm =
        Realm.getInstance(
                new RealmConfiguration.Builder(context)
                        .name("myOtherRealm.realm")
                        .build()
);

创建RealmObject

如果一个javabean继承了RealmObject,那么它就可以用来存储Realm,如果你想知道什么是javabean,来看看这里的定义:javabean是可序列化的,有一个默认的构造方法,成员变量都提供getter和setter方法。例如,下面的代码可以轻松的保存到Realm中,

public class Country extends RealmObject {

    private String name;
    private int population;

    public Country() { }

    public String getName() {
        return name;
    }

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

    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }

}

可以使用@PrimaryKey注解来表示这个一个成员变量是Realm的主键。例如下面的代码是将code字段作为主键,

@PrimaryKey
private String code;

public String getCode() {
    return code;
}

public void setCode(String code) {
    this.code = code;
}

创建事务

你将会在下面的代码中发现,使用Realm查询数据非常简单, 写入数据稍稍麻烦点。Realm遵循ACID以保证操作的原子性和一致性。在Realm中,所有的写操作都会在一个事务中。

使用beginTransaction方法可以开启一个事务,使用commitTransaction方法去提交一个事务。下面的代码表明如何创建并保存一个Country

myRealm.beginTransaction();

// Create an object
Country country1 = myRealm.createObject(Country.class); 

// Set its fields
country1.setName("Norway");
country1.setPopulation(5165800);
country1.setCode("NO");

myRealm.commitTransaction();

你可能已经注意到了,country1对象并不是使用Country的构造方法创建的,想让RealmObject保存这个实例, 就必须使用createObject方法创建。

如果你必须要使用构造方法的话,别忘了在提交事务之前调用copyToRealm方法将对象关联到Realm上,例如:

// Create the object
Country country2 = new Country();
country2.setName("Russia");
country2.setPopulation(146430430);
country2.setCode("RU");

myRealm.beginTransaction();
    Country copyOfCountry2 = myRealm.copyToRealm(country2);
myRealm.commitTransaction();

查询

Realm提供了一套非常直观简单的API用来查询操作,调用Realmwhere方法,并且将你需要的类的class传递进去, 你就完成了一个查询的创建,之后, 你可以调用findAll方法来遍历所有的数据,返回的数据保存在RealmResults对象中,下面的例子,我们查询出来并且打印了所有的Country

RealmResults<Country> results1 =
        myRealm.where(Country.class).findAll();

for(Country c:results1) {
    Log.d("results1", c.getName());
}

// Prints Norway, RussiaRealmResults<Country> results1 =
        myRealm.where(Country.class).findAll();

for(Country c:results1) {
    Log.d("results1", c.getName());
}

// Prints Norway, Russia

除此之外, 你还可以使用beginsWithendsWithlesserThangreaterThan方法来过滤结果,下面的例如展示了如何使用greaterThan方法来查询所有的population大于1亿的Country

RealmResults<Country> results2 =
        myRealm.where(Country.class)
                .greaterThan("population", 100000000)
                .findAll();

// Gets only Russia

如果你想让查询结果按照某个顺序来,你可以使用findAllSorted方法,它有一个String类型的参数和一个boolean类型的参数,其中,String指定用来排序的字段,boolean指定了排序方式,

// Sort by name, 降序排列
RealmResults<Country> results3 =
        myRealm.where(Country.class)
                .findAllSorted("name", false);

// Gets Russia, Norway

想要学习更多关于Realm的知识,可以参考官方文档

时间: 2024-10-21 04:28:05

在Android加入和使用Realm的相关文章

Android Realm数据库完美解析

当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite. sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型的数据.对于有复杂筛选查询的 操作,file和sharedpreferences都不能满足了.sqlite可以满足有大量复杂查询要求的缓存数据操作.但是sqlite的使用略复杂,代码量很大,还好网上有很多优秀的orm框架可使用,比喻ORMlite,greenDao等. ORMlite,greenDa

Android Realm 详解

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

GitHub Top 100的Android开源库

本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库. 1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native,

android github 知名库

1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, 该框架结合了 Web 应用和 Native 应用的优势, 可以使用 JavaScript 来开发 iOS 和 Android 原生应用 2. Universal ImageLoader ImageLoader 是最早开源的 Android 图片缓存库, 强大的缓存机制, 早期被广泛 Android 应用使用, 至今仍然

2016年年终报告总结

转眼间2016已经飞逝而过,在写这份总结报告的同时也是我对2016的一个回顾,在此,我将从项目与技术两个方面对自我进行一个总结. 一. 2016的收获 项目: 由于2015已经对公司的产品和项目都已经积累了一定的能力和经验,在2016自己更多的精力并不完全放在项目中了,在平时的工作中也有意识的去压缩自己做项目的时间,但是回顾这一年的项目,发现不知不觉中,也开发或参与了20多个项目,主要项目有蜗灯.蜗爱公播.智能积木.标案爱车听.艾捷通.Pixels等 这里主要对个人开发项目与重点项目做如下总结:

转: app端数据库(性能高) realm (ios, android 均支持)

转:  http://ios.jobbole.com/85041/ 移动端数据库新王者:realm 2016/05/14 · iOS开发 · 数据库 分享到:0 原文出处: 没故事的卓同学(@没故事的卓同学) realm 介绍 realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective?C和Swift)以及Android.2014年7月发布.由YCombinator孵化的创业团队历时几年打造,是第一个专门针对移动平台设计的数据库.目标是取代SQLite.为了彻底解决性能问题,

Android数据库Realm实践

Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation). 2. SugarORM SugarORM 是 Android 平台专用ORM.提供简单易学的APIs.可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化C

&lt;Android开源库&gt; Realm For Android~ Getting Help and Models(译文)

帮助 编程问题?询问StackOverflow, 我们会积极地监督和回答问题! 提交Bug? 在我们的repo打开一个问题. 如果可以的话,请告知我们Realm版本,完整日志,Realm文件和显示问题的项目. 功能请求? 在我们的repo打开一个问题. 告诉我们该功能应该做什么,以及为什么需要该功能. 想了解接下来我们会更新什么内容? 看看我们的changelog. 日志显示我们计划最近发布的最新添加和更改,以及Realm的发展历史. 模型 Realm model类都是RealmObject的子

Android WebView 开发教程

1.WebView的使用 (a). 创建WebView的实例加入到Activity中 WebView webview = new WebView(this); setContentView(webview); 或者在xml中配置WebView <Webview android:layout_width="match_parent" android:layout_height="match_parent" > </Webview> (b). 访