请问如何在不刷新所有内容的情况下更新Realm数据库中的特定值,我使用了copyToRealmOrUpdate和insertOrUpdate,问题是,假设我有一个值为 ID , 名称 和 姓氏 如果我实际执行此操作:
final MyObject obj = new MyObject();
obj.setId(42);
obj.setName("Fish");
realm.executeTransaction(new Realm.Transaction()
{
@Override
public void execute (Realm realm){
// This will create a new object in Realm or throw an exception if the
// object already exists (same primary key)
// realm.copyToRealm(obj);
// This will update an existing object with the same primary key
// or create a new object if an object with no primary key = 42
realm.copyToRealmOrUpdate(obj);
}
});
它可能会将 ID 42更新为'name'=“fish”,但如果我查询 姓氏 它不会返回有效值,实际上我在项目中使用的真实代码是:
final RealmDB_Class realmDB_class = new RealmDB_Class();
realmDB_class.setPasswordForPrint("2");//no zero so that it can ask one more time
realmDB_class.setId(1);
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(realmDB_class);
}
}
);
我只想将setpasswordForPrint更新为'2',同时保留我之前保存在领域数据库中的其他值,例如名为'name'的变量。 问题是当我查询名称时,它指向null,可能是因为我没有在这里重新插入它。我不想插入它。
我尝试使用 copyToRealmOrUpdate ,但它也无效。我是否要再次插入所有值,或者没有办法只更新一个值,例如SQL UPDATE'A'ET ... WHERE ... 而不插入新值。如果'row'有姓名和姓氏,我不能仅使用ID更新名称而不再重新输入姓氏。
答案 0 :(得分:8)
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute (Realm realm) {
MyObject obj = realm.where(MyObject.class).equalTo("id", 42).findFirst();
if(obj == null) {
obj = realm.createObject(MyObject.class, 42);
}
obj.setName("Fish");
}
});
或者
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
final RealmDB_Class realmDB_class = realm.where(RealmDB_Class.class).equalTo("id", 1).findFirst();
realmDB_class.setPasswordForPrint("2");
}
});
insertOrUpdate()
无法区分您保存的值是否明确设置为null
,或者您是否从未初始化它,因此要更新特定字段,您需要使用事务内托管对象的访问者。