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?

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.

  • Visibilidad de variables en SQLiteOpenHelper android
  • Android SQLiteMisuseException al llamar a database.rawQuery
  • ¿Por qué INSERTs y UPDATEs son más lentos en Android 4.0?
  • La base de datos SQLite de Android se corrompe
  • SQLite insert No hay error de columna en android
  • Sincronización local de SQLite con Firebase
  • Cómo hacer frente a múltiples cambios en la versión de la base de datos cuando se actualiza la aplicación Android
  • Cambio de cursor en CursorAdapter
  • No se puede eliminar la columna de la tabla sqlite
  • cláusula multiple where en android
  • ¿Cuántas tablas y bases de datos puedo crear en Android sqlite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.