2015-07-27 3 views
1

Я хочу получить рекурсивную структуру данных категорий. Как получить рекурсивное отношение «многие ко многим» с greenDao


структура ОАЯ:

category_structure_oom

категория должна управлять списком или набором (суб) категория.


структура диска:

category_structure_rom

физическая структура диска:

category (_id_, title) 
overAndSubCategories (ocId, scId) 

Оба свойства overAndSubCategories являются внешними ключами и передать идентификатор category.

Название категории уникально и может быть первичным ключом, но greenDao пока не поддерживает строку в качестве первичного ключа. Поэтому я добавляю идентификатор, как описано.


GreenDao не поддерживает многие отношения. Могу ли я реализовать эквивалентную схему, которая решает эту проблему?

* оба изображения с питанием от Yed

ответ

1

Я не уверен, что это решение является правильным или лучше, потому что я не знаю, 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(); 

Два присоединяется плюс, где состояние, кажется, немного много. Желательны лучшие решения.