2011-05-22 25 views
12

Como no es posible agregar claves externas usando una instrucción "ALTER TABLE" en SQLite, estoy atascado en cómo configurar mi base de datos para aplicar claves foráneas válidas, o realizar eliminaciones en cascada sin sobrecarga explícita del código.Creando restricciones de clave externa en ORMLite bajo SQLite

¿Alguien tuvo una idea de cómo lograr esto con ORMLite bajo SQLite?

+0

Encontré la solución getCreateTableStatements(), y funciona como un encanto. Gracias por su respuesta. – Timo

Respuesta

7

cómo configurar mi base de datos para imponer claves foráneas válidas, o realizar eliminaciones en cascada sin sobrecarga de código explícita.

ORMLite soporta un campo columnDefinition="..." en el @Timo @DatabaseFiled anotación. No estoy seguro si le proporciona la potencia que necesita pero le permite tener definiciones de columnas personalizadas.

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()

Si no lo hace, entonces me temo que puede que tenga que crear su base de datos fuera de ORMLite en este caso. Puede usar TableUtils.getCreateTableStatements() para obtener las declaraciones necesarias para crear la tabla y agregar las declaraciones de aplicación y en cascada que necesita. Aquí están los javadocs for that method.

+0

¿Podría por favor publicar ejemplo, cómo usar columnDefinition con restricciones de clave externa? – sealskej

21

elaborar en respuesta impresionante de Grey (para cualquier otra persona que se topa con esta pregunta), puede utilizar la anotación columnDefinition para definir una restricción de clave externa y eliminación en cascada.

En primer lugar, las restricciones de clave externa se agregaron a SQLite en 3.6.19, lo que significa que puede usarlas en Android 2.2 o superior (ya que 2.2 se envía con SQLite 3.6.22). Sin embargo, las restricciones de clave externa son no habilitadas de forma predeterminada. Para habilitarlos, use la técnica de this answer.

Aquí hay un ejemplo usando la anotación columnDefinition. Esto supone que su tabla/objeto a la que hace referencia se llama parent, que tiene una clave principal de id.

@DatabaseField(foreign = true, 
     columnDefinition = "integer references parent(id) on delete cascade") 
private Parent parent; 

Tenga en cuenta que el formato de la cadena de valor no incluye el nombre de la columna (que es lo que la anotación es columnName para).

-3

creo que el siguiente enlace puede ser útil:

http://mueller.panopticdev.com/2011/03/ormlite-and-android.html

en resumen, se puede establecer como:

public class Person { 
... 
@DatabaseField(columnName = "organization_id", canBeNull = false) 
private Organization m_organization; 

De esta manera, la persona tiene una clave externa a la organización, y la clave que usa en la Organización es "organization_id".

Espero que esto ayude.

+0

Esto no explica cómo crear una restricción con eliminación en cascada. –

+0

@KenVanHoeylandt En realidad, no recuerdo esta respuesta ni la pregunta. Lo siento. –

Cuestiones relacionadas