Realm 是一个移动数据库,可运行于手机、平板和可穿戴设备之上。可以让你的应用更快速,带来难以想象的体验。其目标是为了代替 CoreData 和 SQLite 数据库。
Realm非常易用,不是在SQLite基础上的ORM,它有自己的数据查询引擎。是完全重新开发的数据库,速度非常快,并且支持跨平台,数据加密,数据迁移,支持json,流式api等
官网
realm优缺点介绍
现在已经有了realm的可视化工具,realm Studio,支持查看本地.realm文件或连接到Realm服务器.下载地址
在Application初始化
Realm.init(this);
RealmConfiguration configuration = new RealmConfiguration.Builder().name("test.realm").build();
Realm.setDefaultConfiguration(configuration);
在想要使用的时候调用,记得不用时关闭。
realm = Realm.getDefaultInstance();
Do类
public class User extends RealmObject{
@PrimaryKey
private String id;
private int age;
@Required
private String name;
private RealmList dogRealmList;
//省略set,get
private String name;
private int age;
private boolean isFale;
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//创建对象,由于有主键需要加上参数,因为realm不能自增,所有使用uuid代替
User user = realm.createObject(User.class, UUID.randomUUID().toString());
user.setAge(18);
user.setName("谁谁谁");
RealmList dogs = new RealmList<>();
for(int i=0;i<3;i++){
Dog dog = realm.createObject(Dog.class);
dog.setAge(5);
dog.setFale(true);
dog.setName("小白"+i);
dogs.add(dog);
}
user.setDogRealmList(dogs);
//由于有主键使用copyToRealmOrUpdate
realm.copyToRealmOrUpdate(user);
}
});
user表
dog表
点击user表中的list of dog 显示内部dog,这就是realm的关联
通过json添加数据,并且实现异步操作
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
String json = "{id:\"123\",age:5,name:\"szh\",dogRealmList:[{name:\"hh\",age:2,isFale:false},{name:\"sss\",age:4,isFale:false}]}";
realm.createObjectFromJson(User.class,json);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
System.out.println("success");
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
System.out.println("error");
System.out.println(error);
}
});
删除只能删除一张表上的数据,如我删除user,但dog数据没有删
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//先查询再删除
RealmResults result= realm.where(User.class).findAll();
result.get(4).deleteFromRealm();//删除指定位置(第4条记录)的记录
result.deleteFromRealm(4);//删除指定位置(第4条记录)的记录
result.deleteFirstFromRealm(); //删除user表的第一条数据
result.deleteLastFromRealm();//删除user表的最后一条数据
result.deleteAllFromRealm();//删除user表的全部数据
}
});
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//先查询后更改
RealmResults result = realm.where(Dog.class).equalTo("name","hh").findAll();
for(Dog dog : result){
dog.setAge(20);
}
}
});
findAll —- 查询满足条件的所有记录
findAllAsync—-异步查询(当数据量较大,可能会引起ANR的时候,就可以使用findAllAsync)
findFirst —- 查询第一条数据
equalTo —- 根据条件查询(多次使用该函数可以实现多条件查询)
sum —- 对指定字段求和。
average —- 对指定字段求平均值。
min —- 对指定字段求最小值。
max —- 对指定字段求最大值。count : 求结果集的记录数量。
findAll —- 返回结果集所有字段,返回值为RealmResults队列
findAllSorted —- 排序返回结果集所有字段,返回值为RealmResults队列
between —- 指定字段的值在某区间内
greaterThan()|lessThan()—-指定字段的值大于(小于)给定的值
greaterThanOrEqualTo() & lessThanOrEqualTo()—-指定字段的值大于等于(小于等于)给定的值
equalTo() & notEqualTo() —- 指定字段的值(不)等于
contains() —-指定字段的值包含某些字符(指定字段为String)
beginsWith() & endsWith() —-指定字段的值以给定的值开始(结束)
isNull() & isNotNull() —-指定字段的值(不)为null
isEmpty() & isNotEmpty() —-指定字段的值(不)为空
contains() —字符串包含
beginsWith() —字符串以xx开头
endsWith() —字符串以xx结尾
like() —字符串匹配
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults users = realm.where(User.class).findAllSorted("id", Sort.DESCENDING);//按照id倒序排序
long size = users.size();//返回数据的条数
double average = users.average("age");//返回查询结果的中age的平均值
long sum = users.sum("age").longValue();//返回查询结果中age的总数
long min = users.min("age").longValue();//返回查询结果中age的最小值
long max = users.max("age").longValue();//返回查询结果中age的最大值
System.out.println(size);
System.out.println(average);
System.out.println(sum);
System.out.println(min);
System.out.println(max);
}
});
版本升级时注意要将原本的model也更改掉,版本号更改掉(可以保留原数据)或者干脆使用.deleteRealmIfMigrationNeeded()当版本冲突时删除原数据库(不能保留原数据)
RealmConfiguration configuration = new RealmConfiguration.Builder().name("test.realm")
.schemaVersion(1)
.migration(new CustomMigration())
.build();
Realm.setDefaultConfiguration(configuration);
public class CustomMigration implements RealmMigration{
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
RealmSchema schema = realm.getSchema();
if(oldVersion == 0 && newVersion == 1){
RealmObjectSchema userScheme = schema.get("User");
userScheme.addField("money",String.class, FieldAttribute.REQUIRED)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
obj.set("money","11");
}
}).removeField("age");//记得同时删掉model中的age,不然调用时会报异常
oldVersion++;
}
}
}