Realm官方文档笔记(一)
来源:互联网 发布:java游戏破解合集 编辑:程序博客网 时间:2024/06/04 00:49
Realm是一个数据库,特点是简单高效跨平台,今天记录一下看Realm官方文档的笔记
一 安装配置
首先要求Android studio版本要大于等于1.5.1,JDK的版本要求是大于等于7的,支持Android 2.3以上的版本
首先配置,添加路径:在项目的build.gradle中添加
dependencies { classpath "io.realm:realm-gradle-plugin:1.2.0" }其次还要在应用的build.gradle中添加
apply plugin: 'realm-android'
一个实体类需要继承extends RealmObject,在实体类中既可以有setter和getter方法,还可以有自定义方法,支持 public,protected and private(不知道为什么是不是以前的版本,网上有一部分人说不支持自定义方法和只支持private属性),这是文档原文:A Realm model class also supportspublic,protected and private, and fields as well as custom methods.
Realm支持字段类型包括:boolean/ byte/ short /int/ long /float /double /String /Date/ byte[]这么多种,整数类型byte/short/int/long在Realm中映射为相同类型
Realm会自动更新数据,不需要刷新或者更新UI,可以订阅通知,当数据修改时,知道UI应该被刷新
@index是索引属性,会使插入很慢但是查询很快,当只优化读取性能时可以添加索引,支持boolean/ byte/ short /int/ long /String /Date
@PrimaryKey设为主键,使用主键可以使它使用copyToRealmOrUpdate()方法,寻找该主键现有对象,调用copyToRealmOrUpdate时没有主键会抛出异常
@Ignore不被保存在磁盘上
三 写操作(插入 删除 修改)
1.创建对象
创建对象有两种方式:通过createObject直接实例化,或者通过构造器创建,注意,第二种需要先创建对象实例在使用realm.copyToRealm实现
Realm realm = Realm.getDefaultInstance();realm.beginTransaction();User user = realm.createObject(User.class); // 直接创建user.setName("John");user.setEmail("john@corporation.com");realm.commitTransaction();User user = new User("John");//Model User extends RealmObjectuser.setEmail("john@corporation.com");realm.beginTransaction();User realmUser = realm.copyToRealm(user);//构造器创建realm.commitTransaction();
写操作可以提交和取消,提交时写入磁盘,取消时所有更改都会丢弃
当然创建过程还能在简洁一点,就是使用realm.executeTransaction()方法,自动处理开始,提交,和取消
realm.executeTransaction(new Realm.Transaction() {@Overridepublic void execute(Realm realm) {User user = realm.createObject(User.class);user.setName("John");user.setEmail("john@corporation.com");}});
写操作注意阻塞的问题,同时字两个UI和后台写操作会发生ANR错误(无响应),所以最好异步执行写操作,当写操作打开时读操作不阻塞线程,提交后自动更新
使用realm.executeTransactionAsync()方法异步执行
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() { // Transaction was a success. } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { // Transaction failed and was automatically canceled. } });
onSuccess和onError都是可选的,不是必须要写的,异步事物是RealmAsyncTask的对象
RealmAsyncTask transaction = realm.executeTransactionAsync(new Realm.Transaction() {}通过transaction.cancel()可取消待处理的事物
四 查询
查询结果是RealmResults对象,他是有序的可以通过索引访问单个对象
RealmResults<User> result2 = realm.where(User.class) .equalTo("name", "John") .or() .equalTo("name", "Peter") .findAll();
where是表示在哪个类中查询,equalTo是查询条件,name=John,findAll表示查询获取全部符合条件的对象
也可以用括号组括住你要查询的条件beginGroup()相当于左括号,endGroup()相当于右括号
可以给查询结果进行排序
RealmResults<User> result = realm.where(User.class).findAll();result = result.sort("age"); // Sort ascendingresult = result.sort("age", Sort.DESCENDING);一个RealmResults还有多种聚合方式,如下
RealmResults<User> results = realm.where(User.class).findAll();long sum = results.sum("age").longValue();long min = results.min("age").longValue();long max = results.max("age").longValue();double average = results.average("age");
删除可以用deleteFromRealm()
查询也可以是异步的
异步查询时要注册回调
RealmResults<User> result = realm.where(User.class).findAllAsync();private RealmChangeListener callback = new RealmChangeListener() { @Override public void onChange(RealmResults<User> results) { // called once the query complete and on every update }};public void onStart() { result.addChangeListener(callback);}public void onStop () { result.removeChangeListener(callback); // remove a particular listener // or result.removeChangeListeners(); // remove all registered listeners}大概有个了解了,关于线程JSON之类的下一篇再说
- Realm官方文档笔记(一)
- ProGaurd官方文档学习笔记(一)
- django1.5 官方文档阅读笔记(一)
- NFC官方文档学习笔记(一):NFC前台调度
- 学习Solidity官方文档的笔记一
- mysql官方文档阅读笔记(一)
- TensorFlow官方文档中文版-笔记(一)
- ASIHTTPRequest官方文档(一)
- ASIHTTPRequest官方文档(一)
- Realm初探(一)
- Realm Objective‑C 2.4.3 官方文档的翻译
- android网络连接(一)官方文档
- 多线程编程指南(官方文档)一
- voltdb官方文档翻译(一)
- Tornado官方文档,中文翻译(一)
- JAVA语言规范(官方文档)一
- Titan数据库官方文档翻译(一)
- Flume官方文档翻译之(一)
- Win10新建360浏览器快捷菜单
- java api文档的阅读技巧
- 跨越opengl和d3d的鸿沟(二):现代opengl
- Thinkphp+Jqueryfrom图片异步上传预览
- 数据转模型
- Realm官方文档笔记(一)
- Android 中性能优化之lint使用总结
- echarts地图生成
- openvpn在centos 6.5上的安装
- Mql4 自定义函数模板
- 面向对象程序设计上机练习十二(运算符重载)
- 常用的数据源配置
- OCSS的现状与发展趋势
- Web图片滚动条加载、延迟加载技术LazyLoad研究