Я использую Android с ORMLite в небольшом приложении, которое сейчас пишу.Приложение стремится иметь работающую функцию импорта / экспорта, для которой я использую простую структуру XML.И все прекрасно работает, до определенного момента.
Ситуация следующая: Объект A содержит внешний ключ, ссылающийся на Объект B, который ссылается на Объект C через сам внешний ключ.Экспорт базы данных великолепен.Импорт работает с небольшой оговоркой, а именно с тем, что он работает до тех пор, пока идентификаторы всех объектов являются последовательными и начинаются с 1. Но если база данных фрагментирована, то есть я удалил запись здесь и там, после экспорта базы данных,У меня есть "дыры" в сгенерированной структуре XML.Примерами объектов могут быть:
@DatabaseTable("orders")
public class Order {
@DatabaseField(generatedId = true)
private int _id;
@DatabaseField(columnName="date")
private Date _date;
@DatabaseField(columnName="cost")
private double _cost;
@DatabaseField(foreign = true, columnName="customer_id")
private Customer _customer;
// ... more fields, getters and setters
}
@DatabaseTable("customers")
public class Customer {
@DatabaseField(generatedId = true);
private int _id;
@DatabaseField
private String _name;
// ... more fields, getters and setters
}
Допустим, у меня есть база данных с 2 клиентами (идентификаторы 1 и 2), которые содержат соответственно заказы с 1 по 5 и с 6 по 8. Экспорт этого и повторный импортв чистой базе данных работает отлично.Однако, если я удаляю клиента 1 и его заказы и экспортирую его, экспортер запишет их идентификатор, как он есть, то есть
<customer id="2">...</customer>
и
<order id="6">...</order>
<order id="7">...</order>
<order id="8">...</order>
<order id="9">...</order>
и т. Д.Когда я импортирую данные в новую базу данных, я сначала сохраню объект клиента с помощью
custDao.create((Customer)x);
, а затем каждый их заказ с помощью
orderDao.create((Order)o);
Проблема заключается в том, что функция createигнорирует предоставленный идентификатор (который не равен 0), а недавно сгенерированный идентификатор для клиента равен 1 (в новой пустой базе данных).То же самое для заказов.Но так как они ссылаются на клиента с id = 2, связь между ними разорвана.
Итак, после этого довольно многословного объяснения, у меня возникает вопрос: есть ли способ сказать ORMLite, чтобы оно взяло предоставленное значение дляполе generateId и работать с ним, а не перезаписывать его?Я был бы в порядке, если какое-либо Исключение генерируется в случае, если функция создания находит строку уже в таблице с тем же идентификатором, но в противном случае продолжит сохранение записи ... Я подумал об обходном пути: всеобъекты должны сортироваться по идентификатору с использованием интерфейса Comparator;сортировать ArrayList с объектами для импорта;для каждого объекта - считайте предполагаемый идентификатор в int, - сохраните в базе данных, используя dao.create, - если новый идентификатор объекта отличается от предполагаемого идентификатора, измените его с помощью dao.updateId, - перейдите к следующему объекту в списке.Но это кажется слишком громоздким и подверженным ошибкам: что если метод create попытается сгенерировать идентификатор, который вы только что переназначили для предыдущего объекта с помощью updateId?
Я не верю, что моя ситуация таковаредко, что никто не сталкивался с этим раньше.Буду признателен за решение!
С уважением, Тодор