2011-05-22 43 views
12

由于在SQLite中使用“ALTER TABLE”语句添加外键是不可能的,所以我一直坚持如何配置我的数据库以强制执行有效的外键,或者不进行级联删除明确的代码开销。在SQLite下的ORMLite中创建外键约束

有人有一个想法如何使用SQLite下的ORMLite来实现这一点吗?

+0

我找到了getCreateTableStatements()解决方案,它就像一个魅力。谢谢您的回答。 – Timo 2012-02-13 21:01:06

回答

7

如何配置我的数据库以强制执行有效的外键或执行级联删除而没有明确的代码开销。

ORMLite支持@DatabaseFiled注释@Timo中的columnDefinition="..."字段。我不确定它是否为您提供了所需的功能,但它确实可以让您拥有自定义列定义。

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

如果它不那么恐怕你可能需要的ORMLite外创建数据库在这种情况下。您可以使用TableUtils.getCreateTableStatements()来获取创建表所需的语句,并添加所需的强制语句和级联语句。这里是javadocs for that method

+0

你可以请帖后,如何使用columnDefinition与外键约束? – sealskej 2012-02-29 00:22:43

21

要详细说明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; 

注意,对于字符串值的格式不包括列名(这是columnName注释是什么)。

-3

我想下一个链接可以帮助:

http://mueller.panopticdev.com/2011/03/ormlite-and-android.html

总之

,你可以将其设置为:

public class Person { 
... 
@DatabaseField(columnName = "organization_id", canBeNull = false) 
private Organization m_organization; 

这样,人都有一个外键,组织,和它在组织上使用的密钥是“organization_id”。

希望这会有所帮助。

+0

这并没有解释如何使用级联删除创建约束。 – 2015-10-06 11:35:48

+0

@KenVanHoeylandt我其实不记得这个答案和问题。抱歉。 – 2015-10-06 16:19:12