前言
上篇是Realm源码分析的开篇,是关于Realm数据库的初始化,关键一点是要抓住RealmProxyMediator这个代理中介者的实例化过程。在理解了Realm初始化之后,接下来就可以追踪Realm数据库读写等操作的源码了。因篇幅限制,先分析Writes。
Realm Writes
在基础篇中提到过凡是继承RealmObject的对象在Realm中被称作Model,它对应着Realm数据库中的一张表,而Model中的属性映射着Realm数据库表中的列。
先创建一个的Model类,后面会以这个Model来分析Realm数据库的读写相关的操作,其代码如下
public class Dog extends RealmObject { 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; } }
查看RealmObject源码,它的注释很详细,就不再赘述。注意到它是个抽象类,并实现了RealmModel与ManagableObject两个接口。它还提供了不少方法,目前我们先忽略这些细节。另外RealmObject还使用RealmClass注解,推测应该会在自动生成代码的过程中被使用。如下缩略代码:
一大堆的注释 ... ... @RealmClass public abstract class RealmObject implements RealmModel, ManagableObject { ... ... }
再看RealmModel,它是个空接口,注释说得很明白:实现这个接口的并标注RealmClass注解就能由注解处理器自动生成代理类。因此,我们可以推测自己写的这个Dog类,应该会被注解处理器自动生成一个代理类。
/** * Note: Object implementing this interface needs also to be annotated with {@link RealmClass}, * so the annotation processor can generate the underlining proxy class. */ public interface RealmModel { }
而ManagableObject接口,按注释的说法是用于判断RealmObject对象实例的合法性,其代码如下:
/** * This internal interface represents a java object that corresponds to data * that may be managed in the Realm core. It specifies the operations common to all such objects. */ public interface ManagableObject { boolean isManaged(); boolean isValid(); }
在了解了RealmObject类关系结构之后,再来创建RealmObject实例,代码如下:
public void test() { realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { Dog myDog = realm.createObject(Dog.class); myDog.setName("Fido"); myDog.setAge(1); } }); }
上面的executeTransaction方法会同步执行事务操作,在回调方法中就完成了Dog表的创建。先看看createObject方法:
public <E extends RealmModel> E createObject(Class<E> clazz) { checkIfValid(); return createObjectInternal(clazz, true, Collections.<String>emptyList()); }
createO