更新Realm中的特定值

时间:2017-10-10 00:06:51

标签: android realm realm-mobile-platform

请问如何在不刷新所有内容的情况下更新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更新名称而不再重新输入姓氏。

1 个答案:

答案 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,或者您是否从未初始化它,因此要更新特定字段,您需要使用事务内托管对象的访问者。