DBflowを使用して複数のテーブルを含むSQLiteデータベースをクエリしています。ビューのクエリがDBFlowで機能しない
:だから私は私のデータベースにSQLビューを作成し、このビューを照会するために良いアイデアだろうことを決めた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));
を:私のクエリは、それがDBflowが結合を使用して読み取ることが一種の難しい合流を多く含んでいるので
SQLite.select()
.from(PlantsAssociations.class)
.queryList();
さらに読みやすい!問題は、私はこのエラーに
database.sqlite.SQLiteExceptionを得ているということではありません:そのような表:PlantsAssociations(コード1):、コンパイル中:私はコピーした場合
PlantsAssociations
* FROMを選択し、私はofficial documentationをチェック
...これは、クエリを生成して貼り付け、それが動作します私のデータベースにSQLiteのコンソールで直接それを実行し、それが「タブのように宣言されたと言いますles ":
ビュー:ビュー(仮想テーブル)は、ビューと同様に宣言されています。
だから私は正確に表のように私のビューに宣言:
@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
何か忘れましたか?
[EDIT] 私は、データベースのバージョン番号を増加させたが、今のクエリはちょうど私の空のリストを返します...
はあなたが読むために行きました[ModelViews](https://agrosner.gitbooks.io/dbflow/content/ModelViews.html) – MikeT
コメントありがとうございました。私はModelViewsを試し、同じ結果を得ました。最大の問題は、空の結果セットだけのエラーメッセージがないので、これを理解するのは難しいことです。私が作成したビューは、コードの読みやすさを向上させるためのものです。ModelViewsクラスでは、ビューdbflowクエリで '@ ModelViewQuery'を宣言します(ただし、このビューは作成されません。それはすでに存在しています)....私はそれを動作させることができても、それはreadyabilityの問題を解決しません。おそらくORMを使用するのは良い選択ではありませんでした。 – Laurent
私は解決策の一部を見つけたと思います。 SQLiteでデータベースにクエリを実行すると、私のPlantテーブルにpictureIdカラムがあります。しかし、DBFlowはそれを見つけることができないようです** SQLiteException:そのような列はありません:pictureid **。ビューを見つけられないかもしれませんが、何も言わず空の結果を返すだけかもしれません。しかし、私はなぜそれがデータベースと私のモデルに存在する列を見つけることができないのか分かりません。 – Laurent