Realm JAVA 2.2.2使用教程
Realm官方网站 :
Android Studio 配置
Step 1: build.gradle(全局)
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:2.2.2"
}
}
Step 1: build.gradle(app)
apply plugin: 'realm-android'
Models(模型) :
创建数据库映射文件(Realm Model)需要继承 RealmObject(基类)
public class User extends RealmObject {
private String name;
private int age;
@Ignore
private int sessionId;
// Standard getters & setters generated by your IDE…
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 int getSessionId() { return sessionId; }
public void setSessionId(int sessionId) { this.sessionId = sessionId; }
}
Realm Model 类文件同时也支持public, protected 和 private 字段和自定义方法.
public class User extends RealmObject {
public String name;
public boolean hasLongName() {
return name.length() > 7;
}
@Override
public boolean equals(Object o) {
// Custom equals comparison
}
}
Field types(字段类型) :
Realm支持以下数据库字段类型 : boolean, byte, short, int, long, float, double, String, Date and byte[].
byte, short, int, and long整数类型在Realm文件中都被映射成同一种类型(long).
此外, RealmObject and RealmList<\? extends RealmObject>的子类也支持模型关系.
封装类型Boolean, Byte, Short, Integer, Long, Float and Double也可以被用到Realm模型中, 可以将封装类的值设置为null.
Required fields and null values(必填字段和空值) :
在某些情况下, null不是字段的适当值. @Required 注解可以检查null值的存在.
只有Boolean, Byte, Short, Integer, Long, Float, Double, String, byte[] and Date可以使用@Required . 其他字段如果使用@Required注解会报错. 隐含地需要具有原始类型和RealmList类型的字段. RealmObject类型的字段始终为空.
Ignoring properties(忽略属性) :
@Ignore注解意味着一个字段不应该持久化到磁盘。如果您的输入包含的字段多于模型的字段,并且您不希望有很多特殊情况来处理这些未使用的数据字段,则忽略这些字段使之不保存到文件中.
Auto-Updating Objects(自动更新对象) :
RealmObjects是实时的,自动更新视图到底层数据,这意味着对象不必被刷新. 修改影响查询的对象将立即反映在结果中.
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Dog myDog = realm.createObject(Dog.class);
myDog.setName("Fido");
myDog.setAge(1);
}
});
Dog myDog = realm.where(Dog.class).equalTo("age", 1).findFirst();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Dog myPuppy = realm.where(Dog.class).equalTo("age", 1).findFirst();
myPuppy.setAge(2);
}
});
myDog.getAge(); // => 2
所有RealmObject和RealmResults的属性不仅保持了Realm的快速和高效,而且它允许你的代码更简单和更具反应性. 例如, 如果您的Activity或Fragment依赖于特定的RealmObject或RealmResults实例, 那么在更新UI之前不必担心刷新或重新获取它们.
Indexing properties(索引) :
@Index注解将向字段添加搜索索引. 这将使插入速度更慢, 数据文件更大, 但查询速度更快. 因此, 建议只在优化读取性能的特定情况时添加索引. 我们支持索引:String,byte,short,int,long,boolean和Date字段.
Primary keys(主键) :
要将字段设为主键, 请使用@PrimaryKey注解, 字段类型必须是字符串(String)或整数(byte,short,int或long)及其封装类型(Byte, Short, Integer, and Long). 不能使用多个字段(compound key 复合键)作为主键.使用字符串字段作为主键意味着字段被索引(@PrimaryKey注解隐式地设置为@Index注解).
使用主键可以使用copyToRealmOrUpdate()方法, 该方法将使用此主键查找现有对象, 如果找到,则更新它;如果没有找到, 它将创建一个新的对象. 在没有主键的类上调用copyToRealmOrUpdate()时, 将抛出异常. 使用主键对性能有影响. 创建和更新对象会有点慢, 而查询预计会快点. 很难给出数字, 因为性能的变化取决于数据集的大小.
当调用Realm.createObject()方法时, 它将返回一个所有字段都设置为默认值的新对象. 在这种情况下, 可能与主键字段为默认值的现有对象存在冲突. 为了避免这种情况, 建议创建一个非托管对象, 设置字段的值, 然后通过copyToRealm()方法将其复制到Realm.
final MyObject obj = new MyObject();
obj.setId(42);
obj.setName("Fish");
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// This will create a new object in Realm or throw an exception if the
// object already exists (same primary key)
// realm.copyToRealm(obj);
// 这个方法将会创建一个新对象或者如果这个对象已经在数据库文件中存在将会抛出异常.
// This will update an existing object with the same primary key
// or create a new object if an object with no primary key = 42
// 调用realm.copyToRealm(obj)方法会更新数据库文件中拥有相同主键的对象或者
// 如果数据库文件中没有主键相同的对象则会创建一个新的对象插入到数据库文件中.
realm.copyToRealmOrUpdate(obj);
}
});
对于String(String)和封装类型(Byte, Short, Integer和Long), 主键可以为null值, 除非@PrimaryKey注解另外与@Required注解同时使用.
Customizing Objects(自定义对象) :
像POJO一样可以使用RealmObject. 你可以设置字段为pubilc 并使用简单的赋值, 而不是setter和getter.
public class Dog extends RealmObject {
public String name;
public int age;
}
你可以像任何其他类一样使用Dog. 为了在Realm中创建一个托管Dog对象, 您可以使用createObject()或copyToRealm()方法.
realm.executeTransaction(new Realm.Transaction() {
@Overrride
public void execute(Realm realm) {
Dog dog = realm.createObject(Dog.class);
dog.name = "Fido";
dog.age = 5;
}
};
你可以添加逻辑到你的setters和getters方法中. 如果您希望在将值存储在Realm之前验证值, 这将非常有用. 此外, 您可以轻松地添加自定义方法到RealmObject.
未完待续…