gpt4 book ai didi

java - 使用 copyToRealmOrUpdate 方法未在 Android 中更新 Realm 数据

转载 作者:行者123 更新时间:2023-12-02 03:08:50 27 4
gpt4 key购买 nike

我正在尝试使用 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 类(class)是这样的

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 即为 1

Timber.d("firs time updated %s",realmController.getFirstTime().getFirstTime());

应该给我更新后的值 2,但它给我的是 1,即旧值。

最佳答案

方法copyToRealmOrUpdate()将:

  • 如果你给它一个非托管对象,那么

    • 如果在具有给定主键的 Realm 中找不到托管 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();

这是一个具有新主键的新对象,因此它会被复制到 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相反。

关于java - 使用 copyToRealmOrUpdate 方法未在 Android 中更新 Realm 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41349380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com