Android ORMLite中相同类型的多个ForeignCollection
我在android上使用OrmLite的结构类似于以下内容: Book类有一个主要BookArticle集合和一个次要BookArticle集合:Android ORMLite中相同类型的多个ForeignCollection,android,sqlite,ormlite,Android,Sqlite,Ormlite,我在android上使用OrmLite的结构类似于以下内容: Book类有一个主要BookArticle集合和一个次要BookArticle集合: @DatabaseTable(tableName = "BookV1", daoClass = BookDaoImplV1.class) public class Book implements IBook { @DatabaseField(id = true) private String id; @Foreig
@DatabaseTable(tableName = "BookV1", daoClass = BookDaoImplV1.class)
public class Book implements IBook {
@DatabaseField(id = true)
private String id;
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> primaryArticles;
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> secondaryArticles;
// constructor getters setters etc...
}
现在使用DAO保存BookArticles和Book可以很好地工作,但是当我想从数据库中获取我的Book实体并访问主要或次要文章(在刷新()之后)时,我遇到了一个问题,因为这两个集合都保存了在其“Book”列中具有书籍id的所有文章(主要和次要)
显然,当从DB中获取时,我需要将这些主要和次要项目分开
我本以为“foreignFieldName”是我问题的答案
@ForeignCollectionField(eager = false, foreignFieldName = "secondaryArticles")
private ForeignCollection<BookArticle> secondaryArticles;
@ForeignCollectionField(eager=false,foreignFieldName=“secondaryArticles”)
私人收藏二手物品;
但显然,它不是这样工作的
我有没有办法区分这两个系列?
也许使用一个简单的注释参数,例如“owningFieldName”或类似的参数,可以将其与BookArticle数据一起保存在DB中
非常感谢你的帮助
亚历克斯我遇到了同样的问题 这不是真正的解决方案,但您可以尝试仅使用一个带有布尔值的列表在主/辅项目之间切换,如下所示:
@DatabaseTable(tableName = "BookV1", daoClass = BookDaoImplV1.class)
public class Book implements IBook {
@DatabaseField(id = true)
private String id;
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> articles;
// constructor getters setters etc...
}
希望从官方文件中看到真正的答案
标识类中ForeignCollection字段的注释,该字段对应于外部表中与当前类的外部id匹配的对象
回到你的书的代码
类
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> primaryArticles;
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> secondaryArticles;
和之后将结果转换为BookArticle
集合
如果你还想在书和文章之间建立一对一的关系。然后,实现初始需求的最简单方法是下一步:
书籍课堂
@DatabaseTable(tableName = "BookV1", daoClass = BookDaoImplV1.class)
public class Book implements IBook {
@DatabaseField(id = true)
private String id;
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> articles;
public Collection<BookArticle> getArticles(boolean primary) throws SQLException {
articles.refreshCollection();
Collection<BookArticle> result = new ArrayList<BookArticle>();
for (BookArticle article : articles) {
if (article.isPrimary() == primary) result.add(article)
}
return result;
}
}
@DatabaseTable(tableName = "BookArticleV1", daoClass = BookArticleDaoImplV1.class)
public class BookArticle implements IBookArticle {
private static final String BOOK_FIELDNAME = "book_id";
@DatabaseField(id = true)
private String id;
@DatabaseField
private String title;
@DatabaseField
private String summary;
@DatabaseField
private boolean primary;
public boolean isPrimary() {
return primary;
}
// for ORM mapping only
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = BOOK_FIELDNAME, index = true)
private Book book;
// constructor getters setters etc..
}
@ForeignCollectionField(eager = false, foreignFieldName = "primaryBook")
private ForeignCollection<BookArticle> primaryArticles;
@ForeignCollectionField(eager = false, foreignFieldName = "secondaryBook")
private ForeignCollection<BookArticle> secondaryArticles;
// for ORM mapping primary Books
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = BOOK_FIELDNAME, index = true)
private Book primaryBook;
// for ORM mapping secondary Books
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = BOOK_FIELDNAME, index = true)
private Book secondaryBook;
要完成第一篇文章,您需要:
- 把它和书联系起来李>
- 将主属性设置为
李>true
- 更新DAO李>
- 调用所需图书实体的
李>getArticles(true)
对于用例“secondary”,使用与
false
值相同的步骤。如果要将多个ForeignerCollection从相同类型添加到一个类中,则必须在BookArticle类中为ORM映射添加两个字段,并将Book类中的该字段链接到ORM映射字段
e、 g
书籍课堂
@DatabaseTable(tableName = "BookV1", daoClass = BookDaoImplV1.class)
public class Book implements IBook {
@DatabaseField(id = true)
private String id;
@ForeignCollectionField(eager = false)
private ForeignCollection<BookArticle> articles;
public Collection<BookArticle> getArticles(boolean primary) throws SQLException {
articles.refreshCollection();
Collection<BookArticle> result = new ArrayList<BookArticle>();
for (BookArticle article : articles) {
if (article.isPrimary() == primary) result.add(article)
}
return result;
}
}
@DatabaseTable(tableName = "BookArticleV1", daoClass = BookArticleDaoImplV1.class)
public class BookArticle implements IBookArticle {
private static final String BOOK_FIELDNAME = "book_id";
@DatabaseField(id = true)
private String id;
@DatabaseField
private String title;
@DatabaseField
private String summary;
@DatabaseField
private boolean primary;
public boolean isPrimary() {
return primary;
}
// for ORM mapping only
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = BOOK_FIELDNAME, index = true)
private Book book;
// constructor getters setters etc..
}
@ForeignCollectionField(eager = false, foreignFieldName = "primaryBook")
private ForeignCollection<BookArticle> primaryArticles;
@ForeignCollectionField(eager = false, foreignFieldName = "secondaryBook")
private ForeignCollection<BookArticle> secondaryArticles;
// for ORM mapping primary Books
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = BOOK_FIELDNAME, index = true)
private Book primaryBook;
// for ORM mapping secondary Books
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = BOOK_FIELDNAME, index = true)
private Book secondaryBook;
当您现在调用bookDao.queryAll()并访问辅助文章列表时,您将看到这些文章链接正确
缺点是,在BookArticle表中有2个列用于输入键
问候,,
科德尼克斯