studio simple ejemplo java android sqlite3 ormlite

java - simple - ¿Puedo suspender temporalmente la identificación generada automáticamente en ORMLite?



ormlite c# (1)

Estoy usando Android con ORMLite en una pequeña aplicación que estoy escribiendo actualmente. La aplicación tiene como objetivo tener una función de importación / exportación en funcionamiento, para lo cual utilizo el framework Simple XML. Y todo funciona bien, hasta cierto punto.

La situación es la siguiente: el objeto A contiene una clave externa que hace referencia al objeto B, que hace referencia al objeto C a través de una clave externa. Exportar una base de datos es genial. Importar funciona, con una pequeña advertencia, a saber, que funciona siempre que los ID de todos los objetos sean secuenciales y comiencen desde 1. Pero si la base de datos está fragmentada, es decir, borré un registro aquí y allá, después de exportar la base de datos. Tengo "agujeros" en la estructura XML generada. Los objetos de ejemplo podrían ser:

@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 }

Digamos que tengo una base de datos con 2 clientes (id 1 y 2), que mantienen pedidos del 1 al 5 y del 6 al 8 respectivamente. Exportar esto y luego volver a importar en una base de datos limpia funciona muy bien. Sin embargo, si elimino el cliente 1 y sus pedidos y lo exporto, el exportador escribirá su identificación tal como está, es decir,

<customer id="2">...</customer>

y

<order id="6">...</order> <order id="7">...</order> <order id="8">...</order> <order id="9">...</order>

etc. Cuando importo los datos en una nueva base de datos, primero guardo el objeto del cliente a través de

custDao.create((Customer)x);

y luego cada uno de sus pedidos a través de

orderDao.create((Order)o);

El problema es que la función de creación no tiene en cuenta el ID proporcionado (que no es 0) y el ID generado recientemente para el cliente es 1 (en una base de datos nueva y vacía). Lo mismo para los pedidos. Pero dado que hacen referencia al cliente con id = 2, el vínculo entre ellos está roto.

Entonces, después de esta explicación algo larga, esta es mi pregunta: ¿Hay alguna manera de decirle a ORMLite que tome el valor proporcionado para un campo generadoId y lo ejecute, en lugar de sobrescribirlo? Estaría bien, si se genera alguna Excepción en caso de que la función de creación encuentre una fila que ya esté en la tabla con la misma ID, pero procedería a guardar el registro de lo contrario ... He pensado en una solución alternativa para esto: todo el los objetos deben poder clasificarse por ID usando la interfaz del Comparador; ordenar ArrayList con los objetos que se importarán; para cada objeto, lea el supuesto ID en un int, - guarde en la base de datos usando dao.create, - si el nuevo ID del objeto es diferente al supuesto ID, cámbielo a través de dao.updateId, - pase al siguiente objeto en la lista. Pero parece demasiado engorroso y propenso a errores: ¿qué ocurre si el método create intenta generar una identificación, que acaba de reasignar a un objeto anterior con updateId?

No creo que mi situación sea tan rara, que nadie haya encontrado esto antes. ¡Apreciaría una solución!

Saludos cordiales, Todor


ORMLite admite una opción allowGeneratedIdInsert=true para la anotación @DatabaseField que permite insertar un objeto con el ID ya establecido en una tabla de ID generado. Si el valor del campo ID es nulo o el valor predeterminado (0, ...), la base de datos generará la ID. Esto no es compatible con todos los tipos de bases de datos (Derby, por ejemplo). Aquí hay otra discusión sobre este tema específico.

Creo que lo correcto es crear su gráfico de objetos en la memoria, asociar al Customer adecuado en sus objetos Order antes de guardarlos en el disco. Si lee sus Clientes en la memoria, lea en los objetos del Order y establezca el objeto del Customer real en cada uno. Cuando luego creas cada objeto de Customer en la base de datos, ORMLite cambiará el campo de id por el generado, que también lo cambiaría en el campo de id customer_id guardado en cada Order .

Si tiene una tonelada de datos y no puede leerlos todos en la memoria en uno (o por algún otro motivo), entonces siempre puede construir un Map<Integer,Integer> y guardar el Id. Del Customer del XML asignado al ID que obtener después de crearlo en la base de datos. Luego, cuando cargue en los objetos Order , puede establecer la nueva identificación corregida en el objeto extraño.

Espero que esto ayude. Déjame saber más detalles sobre cómo estás leyendo en los objetos y puedo darte un mejor ejemplo de cómo construir el gráfico de objetos.