2017-03-31 118 views
0

在我最近的Android Im項目上,使用OrmLite建立一對多關係以及簡單的一對一關係。 我注意到,對於一對多關係,子對象持有對數據庫中父對象的外鍵引用。仍然當加載父對象OrmLite知道該怎麼做,並加載子元素的集合,這當然是所需的行爲。Android OrmLite外鍵/外鍵集合

但是,對於簡單的一對一關係,父對象似乎需要持有外鍵列才能實現相同的行爲。

所以真正的問題:是否有可能讓OrmLite在一對一的關係中加載子對象,因爲外鍵只在子對象中設置,因爲它是具有一對多關係的標準行爲?

下面是一些示例代碼:

@DatabaseTable 
public class Parent 
{ 

@DatabaseField(foreign = true) 
private Child1 child1; 

@ForeignCollectionField 
private Collection<Child2> children2; 

} 

所以在孩子1和2,我需要有這樣的參考父:

public class Child1/Child2 
{  

    @DatabaseField(foreign = true) 
    private Parent parent; 
} 

因此節省的child2我簡單地設置時

child2.setParent(parent); 
child2Dao.create(child2) 

但是,爲了在查詢包含child1和child2的父代時達到相同的行爲,我將LD必須圍繞拯救關係的其他方式:

parent.setChild1(child1) 
parentDao.create(parent) 

這是非常不方便的,因爲我想無論是child1 /的child2都拿着父母的外鍵或周圍的其他方法。但混合似乎有點難看!

任何想法如何實現?

我在這裏搜索了這個問題的答案,但沒有找到答案。如果它是重複的,我很抱歉!

非常感謝!

編輯:

更準確的說: 是否有可能設置的外鍵我child1表,仍然能夠查詢父時獲得child1。 ORMLite爲child2的外部收集自動完成它。我想要child1的相同行爲。 但是,當我設置

child1.setParent(parent); 
child1Dao.create(child1); 

,然後進行查詢

Parent parent = parentDao.queryForId(1) 

只的child2因爲父表沒有引用(外鍵)的child1獲得。只有child1具有對父級的引用。因此:我想要OrmLite自動更新父外鍵列,或者告訴Ormlite仍然獲取child1,即使父代中沒有設置外鍵(因爲這與child2的集合情況完全相同)。 這是可能的嗎?或不?

我希望這不是太混亂:)我完全知道,只是將外鍵設置在父項中會更簡單。但我真的不喜歡這種方法,因爲我最終會得到一些孩子有父母的外鍵,有些孩子沒有。

非常感謝您

回答

0

ORMLite支持「洋」的對象,其中一個或多個字段對應的對象持久保存在另一個表中同一數據庫的概念。例如,如果您的數據庫中有一個Order對象,並且每個Order都有一個相應的Account對象,那麼Order對象將具有外部Account字段。使用外部對象時,賬戶中的id字段將作爲「account_id」列保存到Order表中。例如,Order類可能看起來像:

@DatabaseTable(tableName = "orders") 
public class Order { 

    @DatabaseField(generatedId = true) 
    private int id; 

    @DatabaseField(canBeNull = false, foreign = true) 
    private Account account; 
    … 
} 

當創建順序表,將產生類似下面的SQL:

CREATE TABLE `orders` 
    (`id` INTEGER AUTO_INCREMENT , `account_id` INTEGER, 
    PRIMARY KEY (`id`)); 

當您創建一個領域與外國對象,請注意,異物不會自動爲您創建。如果您的外部對象具有由數據庫提供的生成標識,那麼您需要在創建引用它的任何對象之前創建它。例如:

Account account = new Account("Jim Coakley"); 
accountDao.create(account); 
// this will create the account object and set any generated ids 

// now we can set the account on the order and create it 
Order order = new Order("Jim Sanders", 12.34); 
order.setAccount(account); 
… 
orderDao.create(order); 

外部收集允許您在帳戶表中添加一組訂單。無論何時Account對象由查詢返回或由DAO刷新,都會在訂單表上進行單獨查詢,並在該賬戶上設置一組訂單。集合中的所有訂單都有與該帳戶相匹配的對應外部對象。例如:

public class Account { 
    … 
    @ForeignCollectionField(eager = false) 
    ForeignCollection<Order> orders; 
    … 
} 

在上面的例子中,@ForeignCollectionField註釋標記的命令字段是匹配帳戶的命令的集合。訂單的字段類型必須是ForeignCollection或Collection - 不支持其他集合,因爲它們在支持許多方法時要重得多。

來源:http://ormlite.com/

+0

非常感謝您爲您的快速響應實現這一目標!我完全知道ORM的基本功能,因爲Im來自MS實體框架背景。我似乎對自己的問題不太清楚,我會盡力更新。 –

+0

所以請看看編輯。我實際上可能需要類似於@ForeignField(我認爲它不存在於OrmLite中),它不存儲外鍵但是告訴ORMLite在查詢帳戶(父)時包含命令(子) –

0

ORMLite documentation的DatabaseField是,默認情況下,與canBeNull =真。因此,創建Child1時不需要設置父項。要獲得父母中的孩子,反之亦然,您可以設置foreignAutoRefresh = true。

如果你想離開外鍵列在只有一張桌子,也許你可以通過設置maxForeignAutoRefreshLevel = 1

+0

感謝您的支持響應!不幸的是,這不是我正在尋找的。我知道外國的新聞,但我的問題是針對另一個方向。我會更新我的問題。 –

+0

我明白你的問題。我沒有在ORMLite文檔中找到答案,您可以嘗試將您的問題發送給ORMLite開發團隊。 – Alexandre

+0

好的,謝謝你!將嘗試。 –