Обновить конкретные свойства модели области?

Как обновить только некоторые свойства модели области, а не пытаться снова и снова сохранять полную модель области, используя copyToRealmOrUpdate(),

public class User extends RealmObject {

@PrimaryKey
public String id = UUID.randomUUID().toString();
private String          name;
private int             age;

@Ignore
private int             sessionId;

// Standard getters & setters generated by your IDE…
public String getName() { return name; }
public void   setName(String name) { this.name = name; }
public int    getAge() { return age; }
public void   setAge(int age) { this.age = age; }
public int    getSessionId() { return sessionId; }
public void   setSessionId(int sessionId) { this.sessionId = sessionId; 
}
}

1) Если User уже сохраняется в области, и я только хочу обновить name используя первичный ключ id, Что-то вроде Update name only where id = "someValue" в пользователя.

2) Итак, что, если существует 500 моделей областей, и только одно свойство каждой модели областей изменяется. Следует обновить полную модель в области через copyToRealmOrUpdate будет быстрее или итерирует всю модель результатов области и сначала найдет элемент, а затем обновит только одно свойство?

2 ответа

Решение
final String userId = ...;
try(Realm r = Realm.getDefaultInstance()) {
    r.executeTransaction((realm) -> {
        User user = realm.where(User.class).equalTo("id", userId).findFirst();
        if(user != null) {
            user.setName("set name");
        }
    });
}

Вы можете получить управляемый RealmObject по идентификатору, а затем изменить его свойство внутри транзакции.

Вы можете изменить свойства модели внутри Transaction() если вы создали объект через Realm или получили после некоторого запроса в базе данных Realm.

Теперь у вас есть экземпляр этого класса, созданный как:

Realm realm = Realm.getDefaultInstance();
User user = realm.where(User.class).equalTo("id", "your id").findFirst();// since you are serching on the basis of primary key there will be only one object

Поэтому, когда вы хотите изменить его свойство, можете изменить его на Transaction, например:

realm.beginTransaction();
user.setName("abc");
realm.commitTransaction();

Это изменит конкретное свойство не нужно звонить copyToRealmOrUpdate(),

ИЛИ ЖЕ

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
       RealmResults<User> users = realm
            .where(User.class)
            .equalTo("id", "your id")// or some other condition
            .findAll();
        for(User user : users) {
          user.setName("abc");
        }
    }
});

Надеюсь, это поможет!

Другие вопросы по тегам