我正在尝试使用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();
}
我的初次上课是这样的
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();
}
因此,在第一个代码部分中,第一个Timber给出1,可以,但是第二个Timber
Timber.d("firs time updated %s",realmController.getFirstTime().getFirstTime());
应该给我更新的值2,但给我1的旧值。
最佳答案
方法copyToRealmOrUpdate()
将:
如果给它一个非托管对象,那么
如果在具有给定主键的领域中找不到托管RealmObject,则它将使用该给定主键将新项插入到Realm中
如果在Realm中找到具有给定主键的托管RealmObject,则它将对象中的所有字段保存到托管RealmObject中(因此,具有给定主键的对象将更新)
如果给它一个托管对象,那么
如果托管的RealmObject属于同一Realm,并且来自同一线程,则将立即返回
。
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();
这是一个具有新主键的新对象,因此将其复制到领域中。
为了修改现有托管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);
});
附言:Ravi Tamada Realm教程是垃圾,您应该参考this article series及其corresponding Github repository。
关于java - 使用copyToRealmOrUpdate方法在Android中未更新 Realm 数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41349380/