Android 如何与greenDao建立递归多对多关系

Android 如何与greenDao建立递归多对多关系,android,orm,greendao,Android,Orm,Greendao,我想得到类别的递归数据结构。 OOM结构: 类别应管理一个列表或一组(子)类别。 ROM结构: ROM的物理结构: category (_id_, title) overAndSubCategories (ocId, scId) over和subcategories的两个属性都是外键,并引用类别的id category的标题是唯一的,可以是主键,但greenDao目前不支持将字符串作为主键。所以我添加了一个记录在案的id GreenDao不支持多对多关系。我是否能够实现解决此结构问题

我想得到类别的递归数据结构。
OOM结构:

类别应管理一个列表或一组(子)类别。
ROM结构:

ROM的物理结构:

category (_id_, title)
overAndSubCategories (ocId, scId)
over和subcategories
的两个属性都是外键,并引用
类别的id

category的标题是唯一的,可以是主键,但greenDao目前不支持将字符串作为主键。所以我添加了一个记录在案的id


GreenDao不支持多对多关系。我是否能够实现解决此结构问题的等效方案


*这两个图像都是由yEd驱动的,我不确定这个解决方案是正确的还是最好的,因为我不知道100%我在做什么,但它是有效的

方案生成器:

final Entity category = schema.addEntity("Category");
category.addIdProperty();
category.addStringProperty("Name").notNull().unique().index();

final Entity overSubCategory = schema.addEntity("OverSubCategory");
// no own id! we do not want to load objects of this type
final Property fkOverCategory = overSubCategory.addLongProperty("IdO").notNull().getProperty();
final Property fkSubCategory = overSubCategory.addLongProperty("IdS").notNull().getProperty();
overSubCategory.addToOne(category, fkOverCategory, "OverCategory");
overSubCategory.addToOne(category, fkSubCategory, "SubCategory");
本计划的用途:

/* # write # */

final CategoryDao categoryDao = session.getCategoryDao();
final OverSubCategoryDao overSubCategory = session.getOverSubCategoryDao();

// overcategories
final Category oC1 = new Category(1l, "food and drink");
final Category oC2 = new Category(2l, "party");
// subcategories
final Category sC1 = new Category(3l, "junkfood");
final Category sC2 = new Category(4l, "restaurante");
final Category sC3 = new Category(5l, "pub");

categoryDao.insert(oC1);
categoryDao.insert(oC2);
categoryDao.insert(sC1);
categoryDao.insert(sC2);
categoryDao.insert(sC3);

overSubCategory.insert( new OverSubCategory(oC1.getId(), sC1.getId()) );
overSubCategory.insert( new OverSubCategory(oC1.getId(), sC2.getId()) );
overSubCategory.insert( new OverSubCategory(oC1.getId(), sC3.getId()) );
overSubCategory.insert( new OverSubCategory(oC2.getId(), sC3.getId()) );

/* # read # */

final QueryBuilder<Category> cqb = categoryDao.queryBuilder();
// all categories that are subcategories and ...
final Join joinOverSubCategories = cqb.join(OverSubCategory.class, OverSubCategoryDao.Properties.IdS);
// ... whose overcategories ...
final Join joinSubCategories = cqb.join(joinOverSubCategories, OverSubCategoryDao.Properties.IdO, Category.class, CategoryDao.Properties.Id);
// ... named "food and drink".
joinSubCategories.where(CategoryDao.Properties.Name.eq("food and drink"));

final List<Category> someSubcategories = cqb.list();
/*#写#*/
final CategoryDao CategoryDao=session.getCategoryDao();
final OverSubCategoryDao overSubCategory=session.getOverSubCategoryDao();
//超范畴
最终类别oC1=新类别(1l,“食品和饮料”);
最终类别oC2=新类别(2l,“一方”);
//子类别
最终类别sC1=新类别(3l,“垃圾食品”);
最终类别sC2=新类别(4l,“餐厅”);
最终类别sC3=新类别(5l,“pub”);
类别Dao.插入(oC1);
类别Dao.插入(oC2);
类别Dao.插入(sC1);
目录Dao.插入(sC2);
类别Dao.插入(sC3);
insert(新的overSubCategory(oC1.getId(),sC1.getId());
insert(新的overSubCategory(oC1.getId(),sC2.getId());
insert(新的overSubCategory(oC1.getId(),sC3.getId());
insert(新的overSubCategory(oC2.getId(),sC3.getId());
/*#读#*/
final QueryBuilder cqb=categoryDao.QueryBuilder();
//属于子类别的所有类别和。。。
final Join joinOverSubCategories=cqb.Join(OverSubCategory.class,OverSubCategoryDao.Properties.IdS);
// ... 谁的超目录。。。
最终连接joinSubCategories=cqb.Join(joinOverSubCategories,OverSubcategoridao.Properties.IdO,Category.class,Categoridao.Properties.Id);
// ... 名为“食品和饮料”。
joinSubCategories.where(CategoryDao.Properties.Name.eq(“食品和饮料”));
最终列表someSubcategories=cqb.List();
两个连接加上一个where条件似乎有点太多。 更好的解决方案是可取的