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

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

解决方法

一个项目工作期间,我被困在同一个问题上.

通过DaoGenerator生成代码,即使使用ToMany关系也不会产生外键限制.

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

引用sqlite文档,我发现外键不是认实现的.你必须运行查询PRAGMA foreign_keys = ON;为每个创建到数据库的连接.我从adb shell验证了它.运行PRAGMA查询后执行外键.

最后一个问题是在项目中为此代码找到一个地方,以便每个会话都执行该代码.

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

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

在构造函数的末尾.

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...