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

时间:2014-01-27 06:25:42

标签: android sqlite 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);

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

插入

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

在构造函数的末尾。

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

答案 1 :(得分:0)

order.addToOne(customer,customerId);

是正确的,它与客户表创建了fk关系。但是下一个声明

customer.addToMany(order,customerId);

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

所以在这种情况下,如果你想创建与客户表使用的多对多关系,比如

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

答案 2 :(得分:-1)

您可以直接写入createTable(){}中的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
}

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