DBflow 在 2 table 之间建立简单的关系

DBflow make simple relation ship between 2 table

android 的 DBFlow 没有很好的文档,在阅读了有关如何在两个 table 之间建立简单关系的更多信息后,我无法做到这一点。

我有 2 个 table 作为:

MainCategoriesSubCategories

SubCategories 我有 channelId 存储在 MainCategoriesMainCategoriesSubCategories table 有更多数据,(一个很多)

现在我正在尝试实现这个关系:

我的代码不正确,与库文档不一样

MainCategories:

@Table(database = AppDatabase.class)
public class ChannelContentCategories extends BaseModel {
    @PrimaryKey(autoincrement = true)
    private int id;

    @Column
    private int channelId;

    @Column
    private String title;

    List<ChannelSubContentCategories> subContentCategories;

    @OneToMany(methods = {OneToMany.Method.ALL})
    public List<ChannelSubContentCategories> getMyChannelSubContentCategoriess() {
        ...
    }

    ...
}

SubCategories:

@Table(database = AppDatabase.class)
public class ChannelSubContentCategories extends BaseModel {
    @PrimaryKey(autoincrement = true)
    private int id;

    @Column
    private int categoryId;

    @Column
    private int parentId;

    @Column
    private String title;

    ...
}

如何在 ChannelContentCategories table 上的 channelIdChannelSubContentCategories table 上的 parentId 之间建立简单的关系?

提前致谢

您不必从数据库加载数据然后关联它。只需使用 SQL 语句来组合所有这些信息。

SELECT column_name.Table_name1, column_name.Table_name2, column_name.Table_name3 FROM Table_name1, Table_name2, Table_name3 WHERE id.Table_name1 == id.Table_name2 && id.Table_name1 == id.Table_name3;

希望对您有所帮助

您要将频道 ID 用作主要类别的外键吗?

像这样? :

@ForeignKey(tableClass = SubCategories.class)
@Column
private int channelId;

这里的问题是 DBFlow 仅支持 ForeignKey 引用另一个 table 的 PrimaryKey 列。因此,您有 3 不同 种方式来建立您的关系:

  • ChannelContentCategories 中的 @PrimaryKeyid 移动到 channelId
  • 使 parentId 引用 id 而不是 channelId,因此 channelId 不需要 PrimaryKey
  • 或者table中有多个主键。但在这种情况下,您 不能id 主键定义为 autoincremented

所以,我用第三种方法结束了,看看我们有什么:

ChannelContentCategories.java

@Table(database = AppDatabase.class)
public class ChannelContentCategories extends BaseModel {
    @PrimaryKey
    @Column
    public int id;

    @PrimaryKey
    @Column
    public int channelId;

    @Column
    public String title;

    public List<ChannelSubContentCategories> subContentCategories;

    @OneToMany(methods = {OneToMany.Method.ALL}, variableName = "subContentCategories") // this should be equal to the field name, that contains children
    public List<ChannelSubContentCategories> getMyChannelSubContentCategories() {
        if (subContentCategories == null || subContentCategories.isEmpty()) {
            subContentCategories = SQLite.select()
                    .from(ChannelSubContentCategories.class)
                    .where(ChannelSubContentCategories_Table.parentId.eq(channelId))
                    .queryList();
        }
        return subContentCategories;
    }
    ...
} 

ChannelSubContentCategories.java

@Table(database = AppDatabase.class)
public class ChannelSubContentCategories extends BaseModel {
    @PrimaryKey(autoincrement = true)
    @Column
    public int id;

    @Column
    public int categoryId;

    @Column
    @ForeignKey(tableClass = ChannelContentCategories.class,
            references = @ForeignKeyReference(columnName = "parentId", foreignKeyColumnName = "channelId"))
    public int parentId;

    @Column
    public String title;
    ...
} 

我已经测试过它并且有效。随意选择最适合你的方式table。