DBflow 在 2 table 之间建立简单的关系
DBflow make simple relation ship between 2 table
android 的 DBFlow 没有很好的文档,在阅读了有关如何在两个 table 之间建立简单关系的更多信息后,我无法做到这一点。
我有 2 个 table 作为:
MainCategories
和 SubCategories
在 SubCategories
我有 channelId
存储在 MainCategories
,MainCategories
在 SubCategories
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 上的 channelId
和 ChannelSubContentCategories
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
中的 @PrimaryKey
从 id
移动到 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。
android 的 DBFlow 没有很好的文档,在阅读了有关如何在两个 table 之间建立简单关系的更多信息后,我无法做到这一点。
我有 2 个 table 作为:
MainCategories
和 SubCategories
在 SubCategories
我有 channelId
存储在 MainCategories
,MainCategories
在 SubCategories
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 上的 channelId
和 ChannelSubContentCategories
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
中的@PrimaryKey
从id
移动到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。