greenDAO manyToMany反身关系

时间:2015-02-07 11:50:36

标签: android many-to-many has-many-through greendao

我正在试图弄清楚如何在GreenDao中为Android建立这种关系。

我们有一个NavigationNode,可以有ManytoMany其他NavigationNodes。

在Rails中,我们使用' has_many:通过'使用NavigationPath连接表:

class NavigationPoint < ActiveRecord::Base
  has_many :navigation_paths, dependent: :destroy
  has_many :paths, through: :navigation_paths, source: :navigation_point, dependent: :destroy
end

class NavigationPath < ActiveRecord::Base
  attr_accessible :navigation_point_id, :connected_point_id
  belongs_to :navigation_point, foreign_key: :connected_point_id
end

在iOS中我们只是将它设置为与NavigationNode上的self关系:

Relationship    Destination         Inverse
-------------------------------------------
paths           NavigationNode      paths

但我似乎无法为greenDAO找到合适的配置。

任何帮助/提示都将不胜感激,谢谢

更新

我现在实施了一个临时解决方案:

NavigationPath的DAO(联接表):

Entity navigationPath = schema.addEntity("NavigationPath");
navigationPath.setSuperclass(SUPER_CLASS);
navigationPath.setIsJoinTable(true);
navigationPath.addIdProperty();
Property fromNavigationNodeProperty = navigationPath.addLongProperty("NavigationNodeID").getProperty();
Property toNavigationNodeProperty = navigationPath.addLongProperty("toNavigationNodeID").getProperty();
ToMany paths = navigationNode.addToMany(navigationPath, fromNavigationNodeProperty, "navigationPaths");

Index indexNavigationPath = new Index();
indexNavigationPath.addProperty(fromNavigationNodeProperty);
indexNavigationPath.addProperty(toNavigationNodeProperty);
indexNavigationPath.makeUnique();
navigationPath.addIndex(indexNavigationPath);

这里是NavigationPath中的自定义关系方法:

public List<NavigationNode> getPaths(String where) {
    if (daoSession == null) {
        throw new DaoException("Entity is detached from DAO context");
    }
    NavigationPathDao pathDao = daoSession.getNavigationPathDao();
    QueryBuilder pathsQuery = pathDao.queryBuilder().where(NavigationPathDao.Properties.NavigationNodeID.eq(id));
    List<NavigationPath> navigationPaths = pathsQuery.list();

    List<NavigationNode> navigationNodesNew = new ArrayList<NavigationNode>();
    for (NavigationPath path : navigationPaths) {
        Long id = path.getToNavigationNodeID();
        NavigationNode node = myDao.load(id);
        if (node != null)
            navigationNodesNew.add(node);
    }
    return navigationNodesNew;
}

这是一个非常天真的实现,但现在它正在工作。

但是,再一次,提示很感激。

1 个答案:

答案 0 :(得分:0)

来自greenDao website

  

多对多关系(n:m)

     

在数据库中,n:m关系使用连接表建模。加入   table保存具有带有外键的行的条目   相关表格。虽然greenDAO不支持n:m关系   直接到现在,您可以将连接表建模为单独的实体。   在实践中,您经常会有“关系实体”   属性,所以你可能还是想这样做。在以后的版本中,   greenDAO可能会直接支持n:m关系。

在没有关系实体的情况下,此时似乎不可能,也许你可以试试。

相关问题