greenDAO不会在表中生成FOREIGN KEY(…)约束

当我创build如下所示的双向1:n关系时,生成器不在表上使用任何FOREIGN KEY(…)约束。

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); 

这是正常的吗? 是否应该在表中生成FOREIGN KEY(…)约束,还是仅在运行时通过代码执行?

Solutions Collecting From Web of "greenDAO不会在表中生成FOREIGN KEY(…)约束"

我在一个项目上工作时遇到同样的问题。

通过DaoGenerator生成的代码,即使使用ToMany关系也不会生成外键约束。

我尝试在每个实体DAO的查询中手动追加外键约束,但它没有解决问题。

引用sqlite文档,我发现外键没有被默认强制执行。 你必须运行查询PRAGMA foreign_keys = ON; 为数据库创build的每个连接。 我从adbshellvalidation它。 运行PRAGMA查询后,外键被强制执行。

最后一个问题是在项目中为这个代码find一个地方,这样它就会在每个会话中执行。

解决scheme在DaoGenerator项目生成的DaoSession类中

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

在构造函数的末尾。

不要忘记在创build具有外键属性的每个DAO的表查询中手动添加外键约束。

order.addToOne(customer,customerId);

是正确的,并创build与客户表的fk关系。 但接下来的声明

customer.addToMany(order,customerId);

是无效的,因为没有属性(称为customerId)被添加到客户表

所以在这种情况下,如果你想创build一个多客户关系表使用像

addToMany(sourceProperty,target,targetProperty)。 但在我看来,不需要customer.addToMany(order,customerId)

您可以直接写入XXXXDao createTable(){}

 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 } 

你必须运行db.execSQL("PRAGMA foreign_keys = ON;");