Android ORMLite中相同类型的多个ForeignCollection

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

我在android上使用OrmLite的结构类似于以下内容:

Book类有一个主要BookArticle集合和一个次要BookArticle集合:

    @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个列用于输入键

问候,, 科德尼克斯