2011-05-22 40 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