我正在使用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