13

由于无法在 SQLite 中使用“ALTER TABLE”语句添加外键,我被困在如何配置我的数据库以强制执行有效的外键,或者在没有显式代码开销的情况下执行级联删除。

有人知道如何在 SQLite 下使用 ORMLite 完成此任务吗?

4

3 回答 3

22

要详细说明 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注释的用途)。

于 2012-05-10T16:28:45.950 回答
7

如何配置我的数据库以强制执行有效的外键,或者在没有显式代码开销的情况下执行级联删除。

ORMLite 支持注解@TimocolumnDefinition="..."中的字段。@DatabaseFiled我不确定它是否为您提供了所需的功能,但它确实允许您拥有自定义列定义。

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()

如果没有,那么在这种情况下,恐怕您可能必须在ORMLite之外创建数据库。您可以使用TableUtils.getCreateTableStatements()获取创建表所需的语句并添加您需要的强制和级联语句。这是该方法的 javadocs

于 2011-05-24T12:06:47.423 回答
-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_id" 。

希望这可以帮助。

于 2014-02-20T08:45:35.717 回答