2017-08-29 1 views
0

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をチェック

enter image description here

...これは、クエリを生成して貼り付け、それが動作します私のデータベースに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] 私は、データベースのバージョン番号を増加させたが、今のクエリはちょうど私の空のリストを返します...

+0

はあなたが読むために行きました[ModelViews](https://agrosner.gitbooks.io/dbflow/content/ModelViews.html) – MikeT

+0

コメントありがとうございました。私はModelViewsを試し、同じ結果を得ました。最大の問題は、空の結果セットだけのエラーメッセージがないので、これを理解するのは難しいことです。私が作成したビューは、コードの読みやすさを向上させるためのものです。ModelViewsクラスでは、ビューdbflowクエリで '@ ModelViewQuery'を宣言します(ただし、このビューは作成されません。それはすでに存在しています)....私はそれを動作させることができても、それはreadyabilityの問題を解決しません。おそらくORMを使用するのは良い選択ではありませんでした。 – Laurent

+0

私は解決策の一部を見つけたと思います。 SQLiteでデータベースにクエリを実行すると、私のPlantテーブルにpictureIdカラムがあります。しかし、DBFlowはそれを見つけることができないようです** SQLiteException:そのような列はありません:pictureid **。ビューを見つけられないかもしれませんが、何も言わず空の結果を返すだけかもしれません。しかし、私はなぜそれがデータベースと私のモデルに存在する列を見つけることができないのか分かりません。 – Laurent

答えて

0

./gradelw cleanその後、アプリをアンインストールし、アプリをReintall。それが動作

...

関連する問題