表名中的ORM Lite Android未知列名

时间:2013-12-10 12:44:29

标签: android database sqlite ormlite

我在我的Android应用程序中使用ORM Lite,我有一个问题是通过过滤外国字段进行搜索,我将在下面发布我的课程:

public class Estabelecimento {

    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField
    public static long codigo;

    @ForeignCollectionField(eager=false)
    private Collection<SituacaoProduto> situacoesProduto;

        ...
}

public class SituacaoProduto {

    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField
    private long codigo;

    @DatabaseField
    private String situacao;

    @DatabaseField(foreign=true)
    private Produto produto;

    @DatabaseField(foreign=true,foreignAutoRefresh=true)
    private Estabelecimento estabelecimento;

        ...
}

这将是我的查找方法:

public List<SituacaoProduto> findByEstabelecimento(Estabelecimento estabelecimento, Context context){

        List<SituacaoProduto> list = new ArrayList<SituacaoProduto>();

        try{
            Dao<SituacaoProduto, Integer> dao = getDatabase(context).getDao(SituacaoProduto.class);
            QueryBuilder<SituacaoProduto, Integer> qBuilder = dao.queryBuilder();
            // Monta select: (estabelecimento.codigo == codigoEstabelecimento)
            qBuilder.where().eq("estabelecimento.codigo", estabelecimento.getCodigo());
            PreparedQuery<SituacaoProduto> pQuery = qBuilder.prepare();

            // Recupera registro            
            list = dao.query(pQuery);

        }catch(SQLException e){
            e.printStackTrace();
            return null;
        }finally{
            if (database != null) {
                OpenHelperManager.releaseHelper();
                database = null;
            }
        }

        return list;
    }

我收到以下错误:

  

12-10 10:32:25.398:E / AndroidRuntime(19575):   java.lang.IllegalArgumentException:未知的列名   表“situacaoproduto”中的“estabelecimento.codigo”

就好像没有引用外国游戏,如果我用我的estabelecimento_id查找方法进行搜索就会让我摆脱错误,但不需要按codigo进行过滤,这是一个代码,来自Web服务:

在这里我找到了一个解决方案,(link),但我拒绝这样做,将类属性声明为public static final是一种不好的做法

一些帮助?

1 个答案:

答案 0 :(得分:1)

我想你想加入这里。您正在尝试返回其SituacaoProduto字段的estabelecimento等于某个值的codigo,对吗?

因此,使用estabelecimentoDao字段codigo所在的eq(...)构建查询。然后使用situacaoProdutoDao查询加入该查询。

有关ORMLite连接功能的详细信息,请参见此处:

http://ormlite.com/docs/join-queries

我认为文档中的示例查询与您的需求非常相似。

  

将类属性声明为public static final是一种不好的做法“。

为什么这是一个糟糕的模式? ORM库如何知道您查询的字段?问题是如果您没有指定列名,ORMLite会为您的外部字段生成一个。他们在该字段上查询的唯一方法(如果您不想在连接机制上使用hte)是指定名称然后导出,以便您的查询代码可以使用它。与public static final共享相同的字符串对我来说很有意义。