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