2017-08-29 63 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应用。

它的工作原理...

相关问题