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

近期使用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 list1 = new ArrayList<>();
        list1.add(obj);
        ArrayList list2 = list1;
        ArrayList list3 = (ArrayList) list1.clone();
        ArrayList list4 = new ArrayList<>();
        list4.addAll(list1);
        ArrayList 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对象无法修改问题)