我正在尝试使用Realm添加和检索数据,就像这样
RealmController realmController = RealmController.with(this).getInstance();
FirstTime firstTime = new FirstTime();
firstTime.setFirstTime(1);
realmController.addFirstTime(firstTime);
Timber.d("firs time %s",realmController.getFirstTime().getFirstTime());
FirstTime firstTime1 = new FirstTime();
firstTime1.setFirstTime(2);
realmController.addFirstTime(firstTime1);
Timber.d("firs time updated %s",realmController.getFirstTime().getFirstTime());
realmController不为null,而realmcontroller.addFirstTime()方法是这样的
public void addFirstTime(FirstTime firstTime){
Timber.d("adding first time %s",firstTime.getFirstTime());
realm.beginTransaction();
realm.copyToRealmOrUpdate(firstTime);
realm.commitTransaction();
}
我的FirstTime课程就像这样
public class FirstTime extends RealmObject{
//0 = firstime; 1 = not firstime
@PrimaryKey
int firstTime;
public int getFirstTime() {
return firstTime;
}
public void setFirstTime(int firstTime) {
this.firstTime = firstTime;
}
}
RealController中的getFirstTime()就像这样
public FirstTime getFirstTime() {
return realm.where(FirstTime.class).findFirst();
}
所以在第一个代码部分,第一个木材给出1,这是可以的,但第二个木材即
Timber.d("firs time updated %s",realmController.getFirstTime().getFirstTime());
应该给我更新的值2,但它给我1,旧值。
答案 0 :(得分:2)
方法copyToRealmOrUpdate()
将:
如果你给它一个非托管对象,那么
如果在Realm中找不到具有给定主键的托管RealmObject,则它将使用该给定主键将新项插入到Realm中
如果在Realm中找到具有给定主键的托管RealmObject,则它会将对象中的所有字段保存到托管的RealmObject中(因此更新了具有给定主键的对象)< / p>
如果你给它一个托管对象,那么
if (object instanceof RealmObjectProxy && ((RealmObjectProxy)object).realmGet$proxyState().getRealm$realm() != null && ((RealmObjectProxy)object).realmGet$proxyState().getRealm$realm().getPath().equals(realm.getPath())) {
return object;
}
在您的情况下,您正在创建一个新的非托管对象
FirstTime firstTime1 = new FirstTime(); // unmanaged object
然后将其设置为以前在数据库中找不到的新主键值
firstTime1.setFirstTime(2); // setting primary key
然后将其添加到数据库
realm.beginTransaction();
realm.copyToRealmOrUpdate(firstTime1); // copy, or update if primary key exists in db
realm.commitTransaction();
这是一个带有新主键的新对象,因此会被复制到Realm中。
为了修改现有的托管RealmObject,您需要通过查询获取托管的RealmObject来修改现有实例:
realm.executeTransaction(... {
FirstTime time = realm.where(FirstTime.class).equalTo("id", 1).findFirst();
time.setSomeValue("blah"); // <-- update the instance in db
});
或者使用copyToRealmOrUpdate()
(或insertOrUpdate()
)使用相同的主键值:
final FirstTime time = new FirstTime();
time.setId(1); // existing ID
time.setSomeValue("blah"); // new value for field
realm.executeTransaction(... {
//realm.copyToRealmOrUpdate(time); //if you do not use the managed proxy, use insertOrUpdate() instead
realm.insertOrUpdate(time);
});
P.S。: Ravi Tamada Realm教程很垃圾,你应该引用this article series及其corresponding Github repository来代替。