Как правильно записывать данные в Realm

304
13 октября 2017, 13:53

У меня есть метод в котором записываю данные в Realm:

public void setChatsList(final ChatsModel chatsModel) {
    Realm realm = null;
    try {
        realm = Realm.getDefaultInstance();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.copyToRealmOrUpdate(chatsModel);
            }
        });
    } finally {
        if (realm != null) {
            realm.close();
        }
    }
}

А считываю данные из базы в этом методе:

ChatsModel getAllChatsList() {
    Realm realm = Realm.getDefaultInstance();
    RealmResults<ChatsModel> chatsModelResult = realm.where(ChatsModel.class).findAll();
    ChatsModel chatsModel = chatsModelResult.get(0);
    return chatsModel;
}

Класс ChatsModel:

public class ChatsModel extends RealmObject {
    public ChatsModel() {
    }
    @SerializedName("response")
    @Expose
    private Response response;
    public Response getResponse() {
        return response;
    }
    public void setResponse(Response response) {
        this.response = response;
    }
}

Класс Response:

public class Response extends RealmObject {
    @SerializedName("count")
    @Expose
    private Integer count;
    @SerializedName("items")
    @Expose
    private RealmList<Item> items = null;
//Сеттеры и геттеры
}

Когда использую метод copyToRealmOrUpdate() для записи в базу, то он не сохраняет. То есть при получении данных в методе getAllChatsList() возвращает 0.

А когда записываю с помощью метода insertOrUpdate(), то он каждый раз при записи не обновляет уже существующую запись а записывает рядом с предыдущим. То есть даже если одинаковые данные

Вопрос: Как можно решить проблему записи и чтения?

Answer 1

Когда Вы используете copyToRealmOrUpdate в Вашей модели ChatsModel должно быть поле с первичным ключом, т.е. поле, которое является уникальным и помечается аннотацией @PrimaryKey. При записи новых данных в базу если поле с первичным ключом будет отличным от тех , которые уже храняться в бд, то создастся новая запись, а если первичный ключ будет совпадать с каким-нибудь другим первичным ключом существующей записи, то запись просто обновиться.

UPDATE

Можете изменить Вашу модель следующим образом:

public class ChatsModel extends RealmObject {
public ChatsModel() {
}
@PrimaryKey
private int id;
@SerializedName("response")
@Expose
private Response response;
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public Response getResponse() {
    return response;
}
public void setResponse(Response response) {
    this.response = response;
} 
}

Перед сохранением в бд id должен быть уникальным, тогда будет создана новая запись. Если, например, в бд есть три записи и у первой id = 1, у второй id = 2, у третьей id = 3, и при сохранении новый id будет совпадать с каким-нибудь id уже существующей записи, то запись просто обновится.

@PrimaryKey используется совместно с методом сохранения realm.copyToRealmOrUpdate(), когда нам нужно обновить какие-то поля уже существующей записи или сохранить новую.

Если Вам не нужно обновлять записи, а просто сохранять все подряд, также можете использовать метод realm.copyToRealm() в этом случае id не нужен и поле не надо отмечать аннотацией @PrimaryKey, этот метод сохраняет все записи подряд не используя первичный ключ, даже если есть одинаковые записи.

READ ALSO
Без двух нулей, решение

Без двух нулей, решение

Даны числа a и bОпределите, сколько существует последовательностей из a нулей и b единиц, в которых никакие два нуля не стоят рядом

478
Как делать запросы одновременно в Retrofit2

Как делать запросы одновременно в Retrofit2

В ВК Api имеется метод messagesgetDialog(), при запросе получаю такой ответ:

216
Есть ли разница в способах задания массива?

Есть ли разница в способах задания массива?

Эти две строки эквивалентны, или есть разница?

334
Не могу переписать XOR с C на Java

Не могу переписать XOR с C на Java

Здравствуйте, переписываю XOR с языка C на Java

314