Настройка поля версии явно в ORMLite

#android #ormlite

#Android #ormlite

Вопрос:

Используя ORMLite на Android, мы используем аннотацию версии, чтобы использовать измененное поле в качестве статуса управления версиями. Однако наш механизм синхронизации клиент / сервер работает таким образом, что сервер сообщает нам, когда объект изменился (поскольку пользователь мог изменить объект на другой платформе / устройстве), и выдает нам обновленный объект.

Теперь проблема:

Предположим, у меня есть следующий код для обновления данного документа:

 Document newDoc = new Document(jsonDocument);
Document oldDoc = ormDBhelp.getDocumentDao().queryForId(newDoc.getfId());
Document.transplantLocalFields(oldDoc, newDoc);
ormDBhelper.getDocumentDao().update(newDoc);
  

Эта команда обновления завершается с ошибкой, потому что в нашем newDoc уже есть более новое измененное поле (и, следовательно, сбой ограничения WHERE version= current-version). Теперь можно было бы оспорить вызов newDoc.modified=oldDoc.modified и просто позволить ему обновиться с текущей датой локального клиента. Но это было бы неправильно, потому что фактическая дата изменения была не в тот момент, когда мы сохраняли ее в нашей локальной базе данных, а вместо этого, когда она была изменена на сервере.

Итак, есть ли какой-либо способ явно установить версию? Или игнорировать ограничения версии для одного запроса?

Заранее спасибо! Может быть, я просто что-то контролирую, или нам просто нужно вручную управлять полем версии и полностью опустить аннотацию версии ORMLite

Ответ №1:

Итак, есть ли какой-либо способ явно установить версию? Или игнорировать ограничения версии для одного запроса?

Вы можете (конечно) выполнить dao.refresh(...) для объекта, чтобы получить последнюю версию от объекта, прежде чем обновлять его. Скорее всего, это правильное решение.

Однако, в качестве взлома, если вам нужно специально изменить версию, вы можете создать 2 объекта, которые оба относятся к одной таблице. У одного из объектов было бы version поле as version=true , а у другого — нет. Затем вы можете использовать поле, не являющееся специальным version , для непосредственного обновления поля.