GreenDAO no genera restricción FOREIGN KEY (…) en la tabla

Cuando creo una relación bidireccional 1: n como se muestra a continuación, el generador no utiliza ninguna restricción FOREIGN KEY (…) en la tabla.

entity customer = schema.addEntity("Customer"); customer.addIdProperty(); customer.addStringProperty("name").notNull(); Entity order = schema.addEntity("Order"); order.setTableName("ORDERS"); // "ORDER" is a reserved keyword order.addIdProperty(); Property orderDate = order.addDateProperty("date").getProperty(); Property customerId = order.addLongProperty("customerId").notNull().getProperty(); order.addToOne(customer, customerId); customer.addToMany(order, customerId); 

¿Esto es normal? ¿Se supone que genera restricciones FOREIGN KEY (…) en la tabla o sólo se aplica en tiempo de ejecución a través de código?

Yo estaba atascado en el mismo problema mientras trabajaba en un proyecto.

Al pasar por el código generado por DaoGenerator, las restricciones de clave externa no se generan incluso con el uso de la relación ToMany.

Intenté agregar la restricción de clave externa manualmente en la consulta en cada DAO de entidad, y sin embargo no resolvió el problema.

Haciendo referencia a la documentación de sqlite, descubrí que la clave externa no se aplica por defecto. Usted tiene que ejecutar la consulta PRAGMA foreign_keys = ON; Para cada conexión creada a la base de datos. Lo verifiqué desde adb shell. La clave externa se aplicó después de ejecutar la consulta PRAGMA.

El último problema fue encontrar un lugar para este código en el proyecto para que se ejecute para cada sesión.

La solución está en la clase DaoSession generada por el proyecto DaoGenerator

insertar

  if(!db.isReadOnly()){ db.execSQL("PRAGMA foreign_keys = ON;"); } 

Al final del constructor.

No olvide agregar manualmente la restricción de clave externa en crear consultas de tabla para cada DAO que tenga propiedad de clave externa.

Order.addToOne (cliente, customerId);

Es correcto y crea la relación de fk con la tabla del cliente. Pero la siguiente declaración

Customer.addToMany (orden, customerId);

No es válida porque no hay ninguna propiedad (llamada customerId) se agrega a la tabla de clientes

Por lo que en este caso si desea crear una relación de muchos a la tabla de clientes como

AddToMany (sourceProperty, target, targetProperty). Pero en mi opinión no hay necesidad de customer.addToMany (order, customerId)

Usted puede escribir directamente a createTable(){} en XXXXDao ,

 public static void createTable(Database db, boolean ifNotExists) { String constraint = ifNotExists? "IF NOT EXISTS ": ""; String sql = "CREATE TABLE " + constraint + "\"PERSONGROUPS\" (" + // "\"_id\" INTEGER PRIMARY KEY ," + // 0: id "\"PID\" TEXT," + // 1: pid "\"GROUP_ID\" INTEGER," + "FOREIGN KEY(\"PID\") REFERENCES PERSONS(\"PID\") ON DELETE CASCADE," + "FOREIGN KEY(\"GROUP_ID\") REFERENCES GROUPS(\"_id\") ON DELETE CASCADE)"; Log.v("PersonGroupDao", sql); db.execSQL(sql); // 2: group_id } 

Y debe ejecutar db.execSQL("PRAGMA foreign_keys = ON;");

  • Índice 0 Requerido con un tamaño de 0 Error en SQLITE DB
  • SqliteException ocupado iOS / Android Xamarin MVVMCross
  • Cómo obtener una fila específica donde se actualiza el valor en android
  • ¿Cómo puedo insertar una comilla doble (") en el campo Varchar de la base de datos SQLite?
  • ¿Cuál es la mejor manera en Android para eliminar todas las filas de una tabla
  • Especificar el tamaño de sqlite db máximo para mi aplicación. Cómo manejar db completa excepción
  • ¿Cómo aceptar cadenas aproximadamente correctas como correctas, al comparar?
  • Cómo agregar fecha en la base de datos sqlite
  • Los ejemplos de ORMLite para Android no compilarán
  • ¿Cómo actualizar una base de datos SQLite y NO perder todos los datos existentes?
  • Cursor finalizado sin advertencia previa de cierre (). ¿Qué significa eso?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.