使用ORMLite实现多对多关系的最佳方法是什么?

时间:2012-02-07 11:11:50

标签: android database relationship ormlite

我正在玩ORMlite来创建一个包含表格和关系的模型。 一种关系是多对多的关系。实现它的最佳方法是什么?

更具体:

假设我有两张桌子

Product
   id
   brand

Purchase
   id

购买可以有多种产品,一种产品可以进行多次购买。 使用ORMLite我可以在每个模型中有@ForeignCollectionField,但我认为它不会起作用。 我看到的唯一有效的解决方案是制作第三个表Product_Purchase,以便将产品和购买与多对一关系联系起来。

你们有什么想法?

3 个答案:

答案 0 :(得分:27)

@ Romain的自我回答是正确的,但这里有更多关于后代的信息。正如他所提到的,有一个多对多ORMLite项目的例子,它展示了实现这一目标的最佳方法:

  

http://ormlite.com/docs/example-many

该示例使用具有两个对象的id的连接表来存储关系。在@ Romain的问题中,连接对象将同时具有ProductPurchase对象。类似的东西:

public class ProductPurchase {
    @DatabaseField(generatedId = true)
    private int id;
    @DatabaseField(foreign = true)
    private Product product;
    @DatabaseField(foreign = true)
    private Purchase purchase;
    ...
}

从创建表格的对象中提取id字段:

CREATE TABLE `userpost` (`id` INTEGER AUTO_INCREMENT , `user_id` INTEGER ,
    `post_id` INTEGER , PRIMARY KEY (`id`) ) 

然后使用内部查询查找与每个Product关联的Purchase个对象,反之亦然。有关详细信息,请参阅示例项目中的lookupPostsForUser()方法。

自动执行此操作已有一些思考和设计工作,但现在ORMLite仅在内部处理一对多关系。

答案 1 :(得分:6)

好吧我想唯一的方法就是创建第三个表Product_Purchase。 它以sample project表示。

答案 2 :(得分:-1)

您必须创建一个ProductPurchase类并对其进行管理,就像它是另一个必须进入您的数据库的对象一样。

你可以(但你不必)在购买中有一个产品集合(反之亦然)但是当你从产品和购买中加载关系时,必须手动更新/创建它们。 ProductPurchase链接器表。拥有这些集合对于ORM来说没有任何意义(你赢了,不应该注释它们)。

如果有人正在寻找具有多对多关系的Android应用程序,我就是一个例子: https://github.com/arthurrauter/ormlite-android