Creación de restricciones de clave externa en ORMLite en SQLite
Como no es posible agregar claves foráneas 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 borrados en cascada sin sobrecarga de código explícito.
Alguien tiene una idea de cómo lograr esto con ORMLite en SQLite?
- No se puede cerrar debido a declaraciones sin finalizar Android
- SQlite Obteniendo las ubicaciones más cercanas (con latitud y longitud)
- Cómo lograr una relación de "herencia" en la base de datos SQLite en Android
- "SELECT last_insert_rowid ()" devuelve siempre "0"
- ¿Cómo puedo abrir el archivo .db. El archivo .db se genera desde eclipse (android) forma DDMS -> File explorer -> data ---> data -> packagename -> base de datos ...?
- Necesidad de almacenar LOTES de datos en el dispositivo Android, pensando en ir OODB
- ¿Detectando la transacción olvidada de SQLite en Android usando StrictMode?
- Obtener id generado después de insertar
- ¿Qué son las aplicaciones com.sec.android.provider. * Exactamente?
- Sqlite no pudo leer row 0 col -1 de cursorwindow de cursor en servicio de alarma
- ¿Qué tan rápido es cursor.moveToPosition (i)?
- Ejecución de varias sentencias con SQLiteDatabase.execSQL
- SQLite de Android: Actualización
Cómo configurar mi base de datos para aplicar claves extranjeras válidas o realizar eliminaciones en cascada sin sobrecarga de código explícito.
ORMLite soporta un campo columnDefinition="..."
en la anotación @DatabaseFiled @Timo. No estoy seguro si le proporciona la potencia que necesita, pero sí 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 utilizar TableUtils.getCreateTableStatements()
para obtener las instrucciones necesarias para crear la tabla y agregar las sentencias de imposición y de cascada que necesita. Aquí están los javadocs para ese método .
Para elaborar la impresionante respuesta de Gray (para cualquier persona que se tropieza con esta pregunta), puede usar la anotación columnDefinition
para definir una restricción de clave externa y una 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 utilizarlos 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 no están activadas de forma predeterminada . Para habilitarlos, utilice la técnica de esta respuesta .
He aquí un ejemplo usando la anotación columnDefinition
. Esto supone que su tabla / objeto que está haciendo referencia se llama parent
que tiene una clave primaria de id
.
@DatabaseField(foreign = true, columnDefinition = "integer references parent(id) on delete cascade") private Parent parent;
Tenga en cuenta que el formato del valor String no incluye el nombre de la columna (para eso es la anotación columnName ).
Creo que el siguiente enlace puede ser útil:
http://mueller.panopticdev.com/2011/03/ormlite-and-android.html
En definitiva, se puede configurar como:
public class Person { ... @DatabaseField(columnName = "organization_id", canBeNull = false) private Organization m_organization;
De esta manera, Person tiene una clave externa para Organization, y la clave que utiliza en Organization es "organization_id".
Espero que esto ayude.