У меня есть метод в котором записываю данные в 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(), то он каждый раз при записи не обновляет уже существующую запись а записывает рядом с предыдущим. То есть даже если одинаковые данные
Вопрос: Как можно решить проблему записи и чтения?
Когда Вы используете 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
, этот метод сохраняет все записи подряд не используя первичный ключ, даже если есть одинаковые записи.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Даны числа a и bОпределите, сколько существует последовательностей из a нулей и b единиц, в которых никакие два нуля не стоят рядом
В ВК Api имеется метод messagesgetDialog(), при запросе получаю такой ответ: