2011-08-16 15 views
6

Actualmente estoy usando ORMLite para trabajar con una base de datos SQLite en Android. Como parte de esto, estoy descargando un montón de datos de un servidor backend y me gustaría tener estos datos agregados a la base de datos SQLite en el mismo formato que está en el servidor de back-end (es decir, los ID son los mismos, etc.) .Android/ORMLite Insertar fila con ID

Por lo tanto, mi pregunta es si llento mi objeto de entrada de base de datos (lo llamaremos Equipo), incluido el campo ID de generado/principal del Equipo a través de setId(), y luego ejecuto un DAO.create() con esa entrada del Equipo guardará esa ID correctamente? Lo intenté de esta manera y me parece que este no fue el caso. Si ese es el caso lo intentaré de nuevo y buscaré otros problemas, pero con los primeros pasos sobre el código no pude encontrar uno. Entonces, esencialmente, si llamo a DAO.create() en un objeto de base de datos con un conjunto de ID, esa ID se enviará a la base de datos y, de lo contrario, ¿cómo puedo insertar una fila con un valor de clave principal ya completado?

Gracias!

Respuesta

13

@Femi es correcto que un objeto puede ser o bien un-id generado o un id, pero no ambos. El problema es más que cómo ORMLite almacena el objeto, pero también tiene que coincidir con el esquema con el que se generó la base de datos.

ORMLite admite una opción de allowGeneratedIdInsert=true a @DatabaseField anotación que permite este comportamiento. Esto no es compatible con algunos tipos de bases de datos (Derby, por ejemplo) pero funciona bajo Android/SQLite.

Para la posteridad, también puede crear 2 objetos que comparten la misma tabla, uno con un ID generado y el otro sin él. Luego puede insertar usando el Dao generado-id para obtener ese comportamiento y el otro Dao para tomar el valor de identificación establecido por el que llama. Aquí está another answer talking about that. El problema para ti es que esto creará muchos DAO adicionales.

La única otra solución es no utilice la identificación para sus propósitos. Deje que la base de datos genere el id. Y luego tenga un campo adicional que use establecido externamente para sus propósitos. Forzar el ID de la base de datos en ciertas circunstancias me parece un mal patrón.

4

De http://ormlite.com/docs/generated-id:

booleana si el campo es un campo id autogenerado. El valor predeterminado es falso. Solo un campo puede tener este conjunto en una clase. Esto le dice a la base de datos que genere automáticamente una identificación correspondiente para cada fila insertada. Cuando se crea un objeto con una ID generada utilizando el método Dao.create(), la base de datos generará una identificación para la fila que será devuelta y configurada en el objeto por el método de creación. Algunas bases de datos requieren secuencias para identificadores generados, en cuyo caso el nombre de la secuencia se generará automáticamente. Para especificar el nombre de la secuencia use generatedIdSequence. Solo se puede especificar uno de esto, id y generateIdSequence.

Debe utilizar generatedId (en cuyo caso aparece todos los identificadores deben ser generadas) o id (en cuyo caso se puede establecer ellos), pero no ambos.

+0

Lo leí, pero supuse que también podría ingresar mi propia ID, porque en otras bases de datos puedo INSERTAR con una identificación incluso si tiene una clave principal generada automáticamente. ¿Es esto algo específico para la configuración de ORMLite, o tal vez bases de datos SQLite? –

+0

Es específico de ORMLite: ver http://ormlite.svn.sourceforge.net/viewvc/ormlite/ormlite-core/trunk/src/main/java/com/j256/ormlite/stmt/mapped/MappedCreate.java? revision = 1861 & view = markup, linea 32.Notará que automáticamente asigna la id para las configuraciones generadaId o generadaIdSecuencia, sin verificar para ver si un valor ya está establecido. Si está utilizando SQLite, puede escribir en la base de datos manualmente y luego volver a cargarlo con ORMLite, o agregar una columna separada para la identificación de la base de datos del servidor (que es lo que hago, aunque no utilizo ORMLite). – Femi

Cuestiones relacionadas