由于无法在SQLite中使用“ALTER TABLE”语句添加外键,因此我坚持如何配置数据库以强制执行有效的外键,或执行级联删除而不显式代码开销。
有人知道如何在SQLite下使用ORMLite来实现这个目标吗?
答案 0 :(得分:22)
详细说明Gray的精彩答案(对于偶然发现此问题的其他人),您可以使用columnDefinition
注释来定义外键约束和级联删除。
首先,3.6.19中的SQLite中添加了外键约束,这意味着您可以在Android 2.2或更高版本中使用它们(因为2.2随附SQLite 3.6.22)。但是,外键约束默认情况下未启用。要启用它们,请使用this answer中的技术。
以下是使用columnDefinition
注释的示例。这假设您引用的表/对象名为parent
,其主键为id
。
@DatabaseField(foreign = true,
columnDefinition = "integer references parent(id) on delete cascade")
private Parent parent;
请注意,String值的格式不包括列名(这是columnName注释的用途)。
答案 1 :(得分:7)
如何配置我的数据库以强制执行有效的外键,或执行级联删除而不显式代码开销。
ORMLite支持columnDefinition="..."
注释@Timo中的@DatabaseFiled
字段。我不确定它是否为您提供了所需的功能,但它确实允许您拥有自定义列定义。
http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()
如果没有,那么我担心在这种情况下您可能必须在ORMLite之外创建数据库。您可以使用TableUtils.getCreateTableStatements()
来获取创建表所需的语句,并添加所需的强制执行和级联语句。以下是javadocs for that method。
答案 2 :(得分:-3)
我认为下一个链接可能会有所帮助:
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的外键,它在Organization上使用的键是“organization_id”。
希望这有帮助。