Realm 是一个轻量的android版本的数据存储库,快速简洁的操作方式,使得其优势得以凸显,我们来看下一个实例:
// 定义需要存储的类,继承自 RealmObject
public class Dog extends RealmObject {
@Required // Name cannot be null
private String name;
private int age;
// ... Generated getters and setters ...
}
public class Person extends RealmObject {
@Required // Name is not nullable
private String name;
private String imageUrl; // imageUrl is an optional field
private RealmList<Dog> dogs; // A person has many dogs (a relationship)
// ... Generated getters and setters ...
}
// 像一般的操作方式使用它
Dog dog = new Dog();
dog.setName("Rex");
dog.setAge("1");
Log.v(TAG, "Name of the dog: " + dog.getName());
// 获取一个Realm实例
Realm realm = Realm.getInstance(context);
// 查找Dog数据库中字段age小于2的所有数据
RealmResults<Dog> puppies = realm.where(Dog.class).lessThan("age", 2).findAll();
puppies.size(); // => 此时还没有插入存储,因此为0
// 保存这个数据
realm.beginTransaction();
realm.copyToRealm(dog);
realm.commitTransaction();
// 查询是自动同步更新的
puppies.size(); // => 1
//异步查询和更新数据
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// 开始查询和修改数据
Dog theDog = realm.where(Dog.class).equals("age", 1).findFirst();
theDog.setAge(3);
}
}, new Realm.Transaction.Callback() {
@Override
public void onSuccess() {
// 原始的查询数据会自动更新
puppies.size(); // => 0 because there are no more puppies (less than 2 years old)
dog.getAge(); // => 3 数据已经修改
}
});
我们来看下如上的流程,发现处理过程比起我们之前使用的数据库方案简单了许多。像litepal的操作已经很简单,但是相对来说还是需要配置一些xml和app参数才可以使用。相对来说,Realm则非常轻量,简单易用,有同步和异步处理方案,代码相对也非常优雅。
前期要求
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
-dontwarn javax.**
-dontwarn io.realm.**
你可以在官方地址查看到所有的api使用接口。
具体Models的使用规则,下一章节再来分析。