我正在使用DBflow来查询包含多个表的SQLite数据库。由于我的查询中包含大量的联接它是一种难以用DBflow阅读加盟:查询视图不适用于DBFlow
SQLite.select()
.from(Plant.class).as("p0")
.innerJoin(Definition.class).as("d0")
.on(Plant_Table.definitionId.withTable(NameAlias.builder("p0").build()).eq(Definition_Table.definitionId.withTable(NameAlias.builder("d0").build())))
.innerJoin(Picture.class).as("pi0")
.on(Plant_Table.pictureId.withTable(NameAlias.builder("p0").build()).eq(Picture_Table.pictureid.withTable(NameAlias.builder("pi0").build())))
.innerJoin(SpaceAssociation.class)
.on(Plant_Table.pictureId.withTable(NameAlias.builder("p0").build()).eq(SpaceAssociation_Table.plantId1))
.innerJoin(Plant.class).as("p1")
.on(SpaceAssociation_Table.plantId2.eq(Plant_Table.plantId.withTable(NameAlias.builder("p1").build())))
.innerJoin(Definition.class).as("d1")
.on(Plant_Table.definitionId.withTable(NameAlias.builder("p1").build()).eq(Definition_Table.definitionId.withTable(NameAlias.builder("d1").build())))
.innerJoin(Picture.class).as("pi1")
.on(Plant_Table.pictureId.withTable(NameAlias.builder("p1").build()).eq(Picture_Table.pictureid.withTable(NameAlias.builder("pi1").build())))
.innerJoin(Flag.class)
.on(SpaceAssociation_Table.flagId.eq(Flag_Table.flagId))
.innerJoin(FlagDefinition.class)
.on(Flag_Table.flagDefinitionId.eq(FlagDefinition_Table.flagDefinitionId));
所以我决定这将是一个更好的主意来创建在我的数据库的SQL视图和查询这样的观点:
SQLite.select()
.from(PlantsAssociations.class)
.queryList();
更具可读性!问题是,我得到这个错误
database.sqlite.SQLiteException:没有这样的表:PlantsAssociations(代码1):在编译:SELECT * FROM
PlantsAssociations
如果我复制和粘贴此生成的查询,并直接在我的数据库它的工作原理SQLite的控制台执行它...
我检查official documentation,它说:“声明如下标签les“:
Views:声明与表一样,支持Views(虚拟表)。
所以我宣布我的看法完全一样的表:
@Table(database = PlantsDatabase.class)
public class PlantsAssociations extends BaseModel {
@PrimaryKey
@Column(name = "p0_plant_id")
private int p0PlantId;
@Column(name = "p0_definition")
private String p0Definition;
@Column(name = "p0_picture")
private String p0Picture;
@Column(name = "p1_plant_id")
private int p1PlantId;
@Column(name = "p1_definition")
private String p1Definition;
@Column(name = "p1_picture")
private String p1Picture;
@Column(name = "flag_id")
private int flagId;
@Column(name = "flag_definition")
private String flagDefinition;
public PlantsAssociations() { }
public PlantsAssociations(int p0PlantId, String p0Definition, String p0Picture, int p1PlantId, String p1Definition, String p1Picture, int flagId, String flagDefinition) {
this.p0PlantId = p0PlantId;
this.p0Definition = p0Definition;
this.p0Picture = p0Picture;
this.p1PlantId = p1PlantId;
this.p1Definition = p1Definition;
this.p1Picture = p1Picture;
this.flagId = flagId;
this.flagDefinition = flagDefinition;
}
public int getP0PlantId() {
return p0PlantId;
}
public void setP0PlantId(int p0PlantId) {
this.p0PlantId = p0PlantId;
}
public String getP0Definition() {
return p0Definition;
}
public void setP0Definition(String p0Definition) {
this.p0Definition = p0Definition;
}
public String getP0Picture() {
return p0Picture;
}
public void setP0Picture(String p0Picture) {
this.p0Picture = p0Picture;
}
public int getP1PlantId() {
return p1PlantId;
}
public void setP1PlantId(int p1PlantId) {
this.p1PlantId = p1PlantId;
}
public String getP1Definition() {
return p1Definition;
}
public void setP1Definition(String p1Definition) {
this.p1Definition = p1Definition;
}
public String getP1Picture() {
return p1Picture;
}
public void setP1Picture(String p1Picture) {
this.p1Picture = p1Picture;
}
public int getFlagId() {
return flagId;
}
public void setFlagId(int flagId) {
this.flagId = flagId;
}
public String getFlagDefinition() {
return flagDefinition;
}
public void setFlagDefinition(String flagDefinition) {
this.flagDefinition = flagDefinition;
}
}
但正如所说,它看起来像DBflow之前生成正确的查询,但也有一些是错误的发现对SQLite的面的图... 。
于是我查了官方SQLite documentation,它看起来像我这样做是正确的:
CREATE VIEW PlantsAssociations
as
select p0.plantid as p0_plant_id,
d0.definition as p0_definition,
pi0.picture as p0_picture,
p1.plantid as p1_plant_id,
d1.definition as p1_definition,
pi1.picture as p1_picture,
flag.flagId as flag_id,
flagDefinition.definition as flag_definition
from plant p0
inner join definition d0
on p0.definitionId = d0.definitionId
inner join picture pi0
on p0.pictureId = pi0.pictureId
inner join spaceAssociation
on p0.plantId = spaceAssociation.plantId1
inner join plant p1
on spaceAssociation.plantId2 = p1.plantid
inner join definition d1
on p1.definitionid = d1.definitionid
inner join flag
on spaceAssociation.flagId = flag.flagId
inner join flagDefinition
on flag.flagDefinitionId = flagDefinition.flagDefinitionId
inner join picture pi1
on p1.pictureid = pi1.pictureid
where d0.definition != d1.definition
我错过了什么?
[编辑] 我只是增加了数据库的版本号,但现在查询只返回我一个空列表...
你有没有去阅读[ModelViews(https://agrosner.gitbooks.io/dbflow/content/ModelViews.html) – MikeT
谢谢你的评论。我试过ModelViews并得到相同的结果。最大的问题是,我没有任何错误消息只是一个空的结果集,所以很难弄清楚这一点。顺便说一句,我用现有的数据库,我创建的视图是为了更好的可读性我的代码和ModelViews类迫使我声明一个@ ModelViewQuery与我的视图dbflow查询(但这个视图永远不会被创建,因为它已经存在)......所以即使我能使它工作也不能解决可用性问题。也许使用ORM不是一个好的选择。 – Laurent
我想我找到了解决方案的一部分。当我用SQLite查询数据库时,我的Plant Table中有一个pictureId列。但它看起来像DBFlow无法找到它** SQLiteException:没有这样的列:pictureid **。也许它不能找到视图,但只是不说,只是返回一个空的结果。但我不知道为什么它无法找到存在于数据库和我的模型中的列。 – Laurent