JAVA深いコピー浅いコピーrealmオブジェクトが修正できない問題を解決する
1907 ワード
最近はRealmデータベースを使用していますが、様々なトランザクションに悩まされており、クエリの結果は直接変更できません.たとえば、次のエラーがあります.
Javaを使用してこの問題を解決します.
出力結果は次のとおりです.
この結果から,最初の4つはいずれも浅いコピーであり,最後の深いコピーである.しかし、write transactionではなく、コピー時にRealm関連のパラメータもコピーしたはずなので、最後の方法では上記の問題を解決することはできません.
最終的な解決方法は以下の通りで、最も愚かで、最も効果的で、このrealmで使ういらいらです:
注:list 3は特殊な状況で、彼はlistに対してcloneをしましたが、listの中の対象は実は変わっていません.やはり元のものです.このような私は半深コピーと呼ぶことができると思います.
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の中の対象は実は変わっていません.やはり元のものです.このような私は半深コピーと呼ぶことができると思います.