createObject
在Realm源码分析之Writes中已经详细追踪过createObject的执行流程,此处不再赘述。
createObject有如下的两个重载方法,区别是如果Model没有指明主键使用前者,否则使用后者:
createObject(Class<E> clazz) createObject(Class<E> clazz, Object primaryKeyValue)
注意:每次使用createObject都会创建新的Model实例。
copyToRealm与copyToRealmOrUpdate
先上Model示例代码,注意是没有指明主键的:
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; } }
使用copyToRealm创建model示例,如下代码:
public void copyToRealm() { realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { Dog myDog = new Dog(); myDog.setName("Copy"); myDog.setAge(6); realm.copyToRealm(myDog); } }); }
开始追踪copyToRealm,如下源码:
public <E extends RealmModel> E copyToRealm(E object) { checkNotNullObject(object); return copyOrUpdate(object, false, new HashMap<RealmModel, RealmObjectProxy>()); }
上面代码先做了对象合法性判断,然后调用了copyOrUpdate这个静态方法,如下代码:
private <E extends RealmModel> E copyOrUpdate(E object, boolean update, Map<RealmModel, RealmObjectProxy> cache) { checkIfValid(); return configuration.getSchemaMediator().copyOrUpdate(this, object, update, cache); }
在Realm源码分析之初始化中已经分析过这个Mediator实例是DefaultRealmModuleMediator,它是有注解处理器自动生成,如下代码:
public <E extends RealmModel> E copyOrUpdate(Realm realm, E obj, boolean update, Map<RealmModel, RealmObjectProxy> cache) { // This cast is correct because obj is either // generated by RealmProxy or the original type extending directly from RealmObject @SuppressWarnings("unchecked") Class<E> clazz = (Class<E>) ((obj instanceof RealmObjectProxy) ? obj.getClass().getSuperclass() : obj.getClass()); if (clazz.equals(com.example.app.org.realm.demo.Dog.class)) { return clazz.cast(io.realm.DogRealmProxy.copyOrUpdate(realm, (com.example.app.org