JAVA深いコピー浅いコピーrealmオブジェクトが修正できない問題を解決する

1907 ワード

最近は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

この結果から,最初の4つはいずれも浅いコピーであり,最後の深いコピーである.しかし、write transactionではなく、コピー時にRealm関連のパラメータもコピーしたはずなので、最後の方法では上記の問題を解決することはできません.
最終的な解決方法は以下の通りで、最も愚かで、最も効果的で、このrealmで使ういらいらです:
class Test implements Cloneable{
        int speed;

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

注:list 3は特殊な状況で、彼はlistに対してcloneをしましたが、listの中の対象は実は変わっていません.やはり元のものです.このような私は半深コピーと呼ぶことができると思います.