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?
- Acceso y almacenamiento de gran cantidad de datos desde el servidor mysql
- Convertir mm-dd-aaaa a aaaa-mm-dd
- (1) cerca de "AUTO_INCREMENT": error de sintaxis al alterar la tabla
- Cómo obtener fechas de la base de datos y comprobar si se solapan?
- Android: carga el contenido de la base de datos sqlite en webview
- ¿Cómo determinas si una .sqlite o .sqback está dañada en Java?
- ¿Cómo unir dos tablas SQLite en mi aplicación de Android?
- Cómo almacenar la imagen en la base de datos SQLite
- Cómo modificar el valor de un elemento en un SQLite?
- Limitar el número de filas devueltas desde sqlite
- IllegalArgumentException: el valor de enlace en el índice 1 es nulo
- ¿Cómo agregar y utilizar la extensión de carga de Sqlite en android?
- SimpleCursorAdapter de Android con consultas utilizando DISTINCT
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;");
- Mejor manera de cambiar el ancho / altura de un widget mediante programación?
- Lista de aplicaciones predeterminadas que muestran errores en Android L