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

Mon*_*eur 10 sqlite android foreign-keys greendao

当我创建如下所示的双向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);
Run Code Online (Sandbox Code Playgroud)

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

Dro*_*yJr 5

在处理项目时我遇到了同样的问题.

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

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

参考sqlite文档,我发现默认情况下不强制执行外键.您必须为PRAGMA foreign_keys = ON;创建到数据库的每个连接运行查询.我从adb shell验证了它.运行PRAGMA查询后强制执行外键.

最后一个问题是在项目中找到这个代码的位置,以便它将为每个会话执行.

解决方案是在DaoGenerator项目生成的DaoSession类中

插入

 if(!db.isReadOnly()){
     db.execSQL("PRAGMA foreign_keys = ON;");
 }
Run Code Online (Sandbox Code Playgroud)

在构造函数的末尾.

不要忘记在具有外键属性的每个DAO的create table查询中手动添加外键约束.