近期使用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中的对象其实没变,还是原来的,这种我觉着可以叫半深拷贝。
网友评论