Я хочу, чтобы ORMlite обновлял строку только в том случае, если идентификатор и номер совпадают, иначе он должен создать новую строку (я использую метод createOrUpdate).
Да, вы не сможете использовать createOrUpdate(...)
, однако вы должны быть в состоянии добавить свой собственный метод DAO, чтобы имитировать его довольно хорошо. Если ID
не будет уникальным, тогда вам нужно будет создать другое поле ID как идентификатор и использовать ID
как просто другое поле, возможно с ограничением uniqueCombo
.
@DatabaseField(generatedId = true)
private int uniqueId;
// not the id field because it is not unique
@DatabaseField
private int id;
@DatabaseField
private int number;
В классе DAO, переопределить BaseDaoImpl
класс и переопределить метод createOrUpdate(...)
. Он должен сделать что-то вроде:
public CreateOrUpdateStatus createOrUpdate(Foo data) throws SQLException {
QueryBuilder<Foo, Integer> qb = queryBuilder();
// NOTE: id here is not the identity field
qb.where().eq("id", data.id).and().eq("number", data.number);
Foo existing = qb.queryForFirst();
if (existing == null) {
int numRows = create(data);
return new CreateOrUpdateStatus(true, false, numRows);
} else {
int numRows = update(data);
return new CreateOrUpdateStatus(false, true, numRows);
}
}
В качестве оптимизации, вы можете создать этот запрос заранее, используя ThreadLocalSelectArg
аргументы для идентификаторов и числовых аргументов, а затем просто установить арг и выполнить запрос в методе createOrUpdate(...)
.
Спасибо за эту ссылку, пропустил ее полностью. Я попробовал uniqueCombo раньше, но это не работает для моей проблемы. – Thommy