greenDAO在表中未生成“FOREIGN KEY(...)”约束

10
当我创建如下的双向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(...)约束,还是仅通过代码在运行时强制执行?


1
我也有同样的疑问。 - kierans
1
你发现了吗? - android developer
1
不行,我希望 @greenrobot 能够回复。 - Monstieur
3个回答

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查询中手动添加外键约束。


0

order.addToOne(customer, customerId);

这是正确的,并且它在customer表中创建了外键关系。但是下一个语句

customer.addToMany(order, customerId);

是无效的,因为在customer表中没有添加名为customerId的属性

所以在这种情况下,如果您想要创建与customer表的一对多关系,请使用如下方式:

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


-1

您可以直接在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;");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接