美文网首页BUG分析
JAVA 深拷贝浅拷贝解决realm对象无法修改问题

JAVA 深拷贝浅拷贝解决realm对象无法修改问题

作者: 土贝口小土孩 | 来源:发表于2020-01-09 18:15 被阅读0次

近期使用Realm数据库,被各种事务搞得心烦,查询出来的结果无法直接改。
比如如下错误:

java.lang.IllegalStateException: Cannot modify managed objects outside of a write transaction.

使用java深拷贝可解决此问题

class Test implements Cloneable{
        int speed;

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    void test() {
        Test obj = new Test();
        obj.speed = 100;

        ArrayList<Test> list1 = new ArrayList<>();
        list1.add(obj);
        ArrayList<Test> list2 = list1;
        ArrayList<Test> list3 = (ArrayList<Test>) list1.clone();
        ArrayList<Test> list4 = new ArrayList<>();
        list4.addAll(list1);
        ArrayList<Test> list5 = new ArrayList<>();
        try {
            list5.add((Test) list1.get(0).clone());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        list1.get(0).speed = 200;

        System.out.println(list1.get(0).speed);
        System.out.println(list2.get(0).speed);
        System.out.println(list3.get(0).speed);
        System.out.println(list4.get(0).speed);
        System.out.println(list5.get(0).speed);
    }

输出结果如下:

200
200
200
200
100

从这个结果来看,前四个都是浅拷贝,最后一个深拷贝。
但是使用最后一种方式也无法解决上面的问题,因为没有在write transaction中,应该是拷贝的时候把一些Realm相关的参数也拷贝过去了,导致这个问题。

最终解决方式如下,最笨的,也是最有效的,用这个realm用的心烦:

class Test implements Cloneable{
        int speed;

        @Override
        public Test clone()  {
            Test test = new Test();
            test.speed = this.speed;
            return test;
        }
    }

注:list3是一种特殊情况,他针对list做了clone,但是list中的对象其实没变,还是原来的,这种我觉着可以叫半深拷贝。

相关文章

  • JAVA 深拷贝浅拷贝解决realm对象无法修改问题

    近期使用Realm数据库,被各种事务搞得心烦,查询出来的结果无法直接改。比如如下错误: 使用java深拷贝可解决此...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • JAVA设计模式:原型模式与拷贝

    深拷贝与浅拷贝 浅拷贝:对象A进行赋值操作得到对象B,这就是浅拷贝,修改对象A的属性会影响到B的属性 深拷贝:深拷...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • PHP之剑走偏锋的DeepCopy

    php的深拷贝和浅拷贝问题,普通变量对象的赋值 = 是深拷贝,& 是浅拷贝。 输出结果: 类对象的拷贝问题就得看下...

  • iOS拷贝

    深拷贝 深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,A_copy不变。 浅拷贝 浅拷贝:只...

  • 学习总结小知识点

    深拷贝、浅拷贝问题 对于不可变对象而言,copy便是浅拷贝,而mutableCopy是深拷贝。对于可变对象而言,c...

  • ###深拷贝和浅拷贝

    深拷贝和浅拷贝 浅拷贝 拷贝出来的地址和源对象的地址一样,意味着修改拷贝的对象会直接影响源对象 钱拷贝是指针拷贝 ...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

网友评论

    本文标题:JAVA 深拷贝浅拷贝解决realm对象无法修改问题

    本文链接:https://www.haomeiwen.com/subject/kbfuactx.html