由于无法在 SQLite 中使用“ALTER TABLE”语句添加外键,我被困在如何配置我的数据库以强制执行有效的外键,或者在没有显式代码开销的情况下执行级联删除。
有人知道如何在 SQLite 下使用 ORMLite 完成此任务吗?
要详细说明 Gray 的出色答案(对于任何偶然发现此问题的人),您可以使用columnDefinition
注释来定义外键约束和级联删除。
首先,外键约束在 3.6.19 中添加到 SQLite,这意味着您可以在 Android 2.2 或更高版本中使用它们(因为 2.2 附带 SQLite 3.6.22)。但是,默认情况下不启用外键约束。要启用它们,请使用此答案中的技术。
columnDefinition
这是使用注释的示例。这假设您引用的表/对象被调用parent
,其主键为id
.
@DatabaseField(foreign = true,
columnDefinition = "integer references parent(id) on delete cascade")
private Parent parent;
请注意,字符串值的格式不包括列名(这就是columnName注释的用途)。
如何配置我的数据库以强制执行有效的外键,或者在没有显式代码开销的情况下执行级联删除。
ORMLite 支持注解@TimocolumnDefinition="..."
中的字段。@DatabaseFiled
我不确定它是否为您提供了所需的功能,但它确实允许您拥有自定义列定义。
http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()
如果没有,那么在这种情况下,恐怕您可能必须在ORMLite之外创建数据库。您可以使用TableUtils.getCreateTableStatements()
获取创建表所需的语句并添加您需要的强制和级联语句。这是该方法的 javadocs。
我认为下一个链接可能会有所帮助:
http://mueller.panopticdev.com/2011/03/ormlite-and-android.html
简而言之,您可以将其设置为:
public class Person {
...
@DatabaseField(columnName = "organization_id", canBeNull = false)
private Organization m_organization;
这样,Person 就有了一个外键来组织,它在组织上使用的键是 "organization_id" 。
希望这可以帮助。