Realm源码分析之copyToRealm与copyToRealmOrUpdate

本文详细分析了Realm中copyToRealm和copyToRealmOrUpdate的方法实现,揭示了两者在处理有无主键模型时的区别。对于无主键模型,二者行为一致,会复用Realm缓存的实例;而对于有主键模型,copyToRealmOrUpdate会在找不到缓存时检查数据库中是否存在匹配主键的记录,存在则更新,不存在则新建。
摘要由CSDN通过智能技术生成
createObject
  1. Realm源码分析之Writes中已经详细追踪过createObject的执行流程,此处不再赘述。

  2. createObject有如下的两个重载方法,区别是如果Model没有指明主键使用前者,否则使用后者

    createObject(Class<E> clazz)
    
    createObject(Class<E> clazz, Object primaryKeyValue)
  3. 注意:每次使用createObject都会创建新的Model实例。

copyToRealm与copyToRealmOrUpdate
  1. 先上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;
        }
    }
    
  2. 使用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);
            }
        });
    }
  3. 开始追踪copyToRealm,如下源码:

    public <E extends RealmModel> E copyToRealm(E object) {
        checkNotNullObject(object);
        return copyOrUpdate(object, false, new HashMap<RealmModel, RealmObjectProxy>());
    }
  4. 上面代码先做了对象合法性判断,然后调用了copyOrUpdate这个静态方法,如下代码:

    private <E extends RealmModel> E copyOrUpdate(E object, boolean update, Map<RealmModel, RealmObjectProxy> cache) {
        checkIfValid();
        return configuration.getSchemaMediator().copyOrUpdate(this, object, update, cache);
    }
  5. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值