Realm 出来这么久了,一直没时间巩固,今天就花点时间巩固下吧。

在没接触Realm之前,基本都是用Sqlite,现在都抛弃Sqlite了,相对于Sqlite来说,Realm更快并且具有很多现代数据库的特性,支持JSON,流式api等,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。当然,现在Realm支持的语言挺多的,更多。

一.添加依赖

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

添加Android 配置

apply plugin: 'realm-android'

二.创建数据库

创建数据库有两种方法:

1、使用默认的配置:

Realm.init(this);
//默认配置
RealmConfiguration configuration = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(configuration);

2、自定义配置:

//自定义配置
RealmConfiguration configuration = new RealmConfiguration.Builder().name("myRealm.realm").deleteRealmIfMigrationNeeded().build();
Realm.setDefaultConfiguration(configuration);

注意:使用默认配置,系统也会生成一个d efault.realm的Realm文件.

三、添加数据

1.创建实体,继承RealmObject

public class Dog extends RealmObject {@PrimaryKey
    private String id;
    private String name;
    private int age;

    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 String getId() {return id;
    }public void setId(String id) {this.id = id;
    }
}

Realm遵循 ACID (数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。

添加数据有两种方式,通过构造器添加或者直接使用Realm.createObject(),一下是两种不同的方式:

Realm myRealm = Realm.getDefaultInstance();
myRealm.beginTransaction();

Dog dog = myRealm.createObject(Dog.class);
dog.setName("小狗");
dog.setAge(2);

myRealm.commitTransaction();
Dog dog = new Dog();
dog.setName("小狗");
dog.setAge(2);

myRealm.beginTransaction();
Dog dog1 = myRealm.copyToRealm(dog);
myRealm.commitTransaction();

四、查询

查询数据使用RealmResults<T>,查询所有数据或者条件查询都行,当然,你也可以对查询的结果进行排序

 public List<Dog> queryAllDog() {RealmResults<Dog> dogs = mRealm.where(Dog.class).findAll();
        /**
         * 对查询结果,按Id进行排序,只能对查询结果进行排序
         */
        //增序排列
//        dogs=dogs.sort("id");
        //降序排列
//        dogs=dogs.sort("id", Sort.DESCENDING);
        return mRealm.copyFromRealm(dogs);
    }
public Dog queryById(String id) {Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();

    return dog;
}

五、删除

删除操作就简单了

Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
mRealm.beginTransaction();
dog.deleteFromRealm();
mRealm.commitTransaction();

六、改

Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
mRealm.beginTransaction();
dog.setName(newName);
mRealm.commitTransaction();

以上都是基于同步操作的,有时候项目里面会用到异步操作

比如异步添加:

RealmAsyncTask  addTask=  mRealm.executeTransactionAsync(new Realm.Transaction() {@Override
    public void execute(Realm realm) {realm.copyToRealm(cat);
    }
}, new Realm.Transaction.OnSuccess() {@Override
    public void onSuccess() {ToastUtil.showShortToast(mContext,"添加成功");
    }
}, new Realm.Transaction.OnError() {@Override
    public void onError(Throwable error) {ToastUtil.showShortToast(mContext,"添加失败");
    }
});

异步查询

RealmResults<Cat>   cats=mRealm.where(Cat.class).findAllAsync();
cats.addChangeListener(new RealmChangeListener<RealmResults<Cat>>() {@Override
    public void onChange(RealmResults<Cat> element) {element= element.sort("id");
        List<Cat> datas=mRealm.copyFromRealm(element);

    }
});

可跟的查询条件:

//可跟查询条件
//.or()                      或者
//.beginsWith()              以xxx开头
//.endsWith()                以xxx结尾
//.greaterThan()             大于
//.greaterThanOrEqualTo()    大于或等于
//.lessThan()                小于
//.lessThanOrEqualTo()       小于或等于
//.equalTo()                 等于
//.notEqualTo()              不等于
//.findAll()                 查询所有
//.average()                 平均值
//.beginGroup()              开始分组
//.endGroup()                结束分组
//.between()                 在a和b之间
//.contains()                包含xxx
//.count()                   统计数量
//.distinct()                去除重复
//.findFirst()               返回结果集的第一行记录
//.isNotEmpty()              非空串
//.isEmpty()                 为空串
//.isNotNull()               非空对象
//.isNull()                  为空对象
//.max()                     最大值
//.maximumDate()             最大日期
//.min()                     最小值
//.minimumDate()             最小日期
//.sum()                     求和  

其他操作照葫芦画瓢。

这里说明一下Realm支持的一些数据类型:

boolean, byte, short, int, long, float, double, String, Date and byte[],在Realm中byte, short, int, long最终都被映射成long类型

Realm中也可以使用注解:

@PrimaryKey
    1.在数据库里面就是主键的意思,字段必须是String、 integer、byte、short、 int、long 以及它们的封装类Byte, Short, Integer, and Long

2.使用了该注解之后可以使用copyToRealmOrUpdate()方法,通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替

3.使用了该注解将默认设置@index注解,查询数据会快一点

@Required
   数据不能为null

@Ignore
    忽略,即该字段不被存储到本地

@Index
    为这个字段添加一个搜索引擎,这将使插入数据变慢、数据增大,但是查询会变快。建议在需要优化读取性能的情况下使用。

了解更多就去官网 Realm Java

demo:https://github.com/hedongBlog/DemoRealm

Realm 数据库的简单使用相关推荐

  1. Realm数据库存储 使用详解

    文章目录 一 Realm 框架 概念介绍 开发辅助工具 二 Realm 使用教程 1 简单的数据操作 创建数据模型 使用RLMRealm对象保存指定模型 使用RLMRealm对象 更新指定模型 使用R ...

  2. ios realm 文件_iOS Realm数据库使用

    Realm 是 SQLite 和 Core Data 的替代者,得益于其零拷贝的设计,Realm 比任何 ORM 都要快很多. Objective‑C版本的 Realm 能够让您以一种安全.耐用以及迅 ...

  3. Realm数据库的使用

    文章目录 写在前面 简单使用 几个概念 1. 数据模型 2. 事务 3. 引用计数 4. 数据库的迁移 添加配置文件 初始化Realm并配置Realm 1. 在application的`onCreat ...

  4. Android Realm数据库完美解析

    转自   http://blog.csdn.net/fesdgasdgasdg/article/details/51897212 demo http://download.csdn.net/detai ...

  5. 如何在Android中使用Realm数据库

    我们都知道使用SQLite的本地数据库,它在Android 开发中用于内部存储器存储,主要存储本地数据,如联系人,电话详细信息等.现在我发现一个比SQLite更轻的数据库,被称为Realm数据库,我想 ...

  6. ios realm 文件_iOS realm数据库使用笔记

    1,引入数据库 这里是使用cocoapods导入,手动导入以后有时间会去做 2,查看数据库路径,以及查看数据库的文件 路径一般都是在Documents里面,打印方法: NSString *path = ...

  7. android realm数据库,浅谈Realm数据库及其使用

    1.Realm介绍 realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android.目前还支持React Native 和 Xamarin. 201 ...

  8. react-native之Realm数据库的使用(一)

    realm数据库是一款小型数据库系统,可以支持多个平台,如android.ios.javascript等.当然了realm也是可以支持react-native的,官网有具体介绍,官网文档 安装real ...

  9. springboot mysql行锁_SpringBoot基于数据库实现简单的分布式锁

    本文介绍SpringBoot基于数据库实现简单的分布式锁. 1.简介 分布式锁的方式有很多种,通常方案有: 基于mysql数据库 基于redis 基于ZooKeeper 网上的实现方式有很多,本文主要 ...

最新文章

  1. 51单片机怎么学啊?有推荐的网课和书籍么?
  2. python furl模块 网址修改 参数解析
  3. CodeForces - 894B Ralph And His Magic Field(组合数学+思维)
  4. c mysql 设置字符集_MYSQL字符集设置的方法详解(终端的字符集)
  5. php什么程度算学会,十天学会PHP - 序1,学会的标准是什么?(20180820-1)
  6. [转]JS对JSON的操作总结
  7. 20190928 On Java8 第二十三章 注解
  8. element中的table相关
  9. 游戏必备组件_没有网络也可以肝的单机小游戏!玩一局就停不下来
  10. node.js 模板引擎
  11. 用python画简单的猴子画法_10种可爱的小猴子简笔画合集,分分钟被萌翻,一看就会画...
  12. C++银行账户管理程序2
  13. 139显示无法imap服务器,139邮箱客户端 imap服务器
  14. openwrt修改默认网关地址_修改宇视摄像机IP地址的方法
  15. A+B的各种写法(不是couta+b;)
  16. ubuntu下安装goldendict及离线词库
  17. (C语言)用函数实现求三个数最大值
  18. Oracle删除数据非常慢
  19. clock gate spec
  20. androidstudio虚拟机打不开的解决方法,一路坎坷,靠运气成功的!!!

热门文章

  1. golang使用grom连接mysql,Error 1146: Table ‘xxx.xxxs‘ doesn‘t exist
  2. 【Python + Zotero】近乎全自动的完美 bib 文件生成
  3. 截图自动添加水印(macOS/windows)
  4. 自定义 FlowLayout流式布局搜索框 加 GreenDao存取搜索记录,使用RecyclerView展示
  5. 安卓开发之沉浸式应用——导航栏状态栏同应用背景
  6. 室内设计属计算机专业吗,室内设计技术专业
  7. oracle SQL语句硬编码带来的问题以及解决办法
  8. 学生学python编程---实现贪吃蛇小游戏+源码
  9. windows编译openssh(automake编译)
  10. 使用 CSS 构建自定义粘性导航栏