2017-08-29 120 views
0

我正在使用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的控制檯執行它...

enter image description here

我檢查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 

我錯過了什麼?

[編輯] 我只是增加了數據庫的版本號,但現在查詢只返回我一個空列表...

+0

你有沒有去閱讀[ModelViews(https://agrosner.gitbooks.io/dbflow/content/ModelViews.html) – MikeT

+0

謝謝你的評論。我試過ModelViews並得到相同的結果。最大的問題是,我沒有任何錯誤消息只是一個空的結果集,所以很難弄清楚這一點。順便說一句,我用現有的數據庫,我創建的視圖是爲了更好的可讀性我的代碼和ModelViews類迫使我聲明一個@ ModelViewQuery與我的視圖dbflow查詢(但這個視圖永遠不會被創建,因爲它已經存在)......所以即使我能使它工作也不能解決可用性問題。也許使用ORM不是一個好的選擇。 – Laurent

+0

我想我找到了解決方案的一部分。當我用SQLite查詢數據庫時,我的Plant Table中有一個pictureId列。但它看起來像DBFlow無法找到它** SQLiteException:沒有這樣的列:pictureid **。也許它不能找到視圖,但只是不說,只是返回一個空的結果。但我不知道爲什麼它無法找到存在於數據庫和我的模型中的列。 – Laurent

回答

0

卸載的應用程序,然後./gradelw clean和Reintall應用。

它的工作原理...

相關問題