2017-03-31 71 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

好的,谢谢你!将尝试。 –