OrmLite:高级逻辑

时间:2013-07-22 13:27:45

标签: android android-sqlite ormlite

我在基于Android的应用程序中有这些表,我正在使用OrmLite进行数据库管理。

enter image description here

我希望拥有x个数组列表,具体取决于我拥有的产品类型的数量。

所以在这种情况下,我想要一个productId等于parentId的产品列表。 所以我想要一个列表

 if(productType = FOLDER) {
    if(productId = parentId){
       //add product
    }
 }

基本上我想要最终得到的东西,在这种情况下是三个列表,每个列表包含一个产品列表,其中parentId对于每个产品都是相同的。

我尝试了很多东西,有些东西比其他东西效果更好,但我想要运行的代码实际上会抛出一个nullpointer。

DatabaseHelper dbHelper = getHelper();
List<Product> productsParents = null;
try {
    Dao<Product, Integer> dao = dbHelper.getDao();
    PreparedQuery<Product> prepQu = dao.queryBuilder().where()
        .eq("parentId", dao.queryBuilder().selectColumns("productId").where()
            .eq("productType", ProductType.FOLDER).prepare()).prepare();
    productsParents = dao.query(prepQu);
} catch (SQLException e) {
    ...
}

此代码无法正常工作,因为productParents返回null,并且它不能执行我想要的操作,即使它只是一个小提示。如果有人知道如何在代码中完成此操作,那么也可能是java和ormlite的混合。

1 个答案:

答案 0 :(得分:1)

您是否有机会在构建查询时使用RTFM? ORMLite文档相当广泛:

  

http://ormlite.com/docs/query-builder

您的问题是准备好的查询不能成为eq(...)方法的参数。不确定您在哪里看到该表单的示例。

所以有几种方法可以做到这一点。最简单的方法是为每个productType执行不同的查询:

Where<Product, Integer> where = dao.queryBuilder().where();
where.eq("parentId", parentId).and().eq("productType", ProductType.FOLDER);
productsParents = where.query();
// then do another similar query again with ProductType.PRODUCT, ...

如果您只想做一个查询,那么您可以获得与parentId匹配的所有产品,然后使用代码将它们分开:

Where<Product, Integer> where = dao.queryBuilder().where();
where.eq("parentId", parentId);
productsParents = where.query();

List<Product> productFolders = new ArrayList<Product>();
List<Product> productProducts = new ArrayList<Product>();
...
for (Product product : productsParents) {
    if (product.getProductType() == ProductType.FOLDER) {
       productFolders.add(product);
    } else if (product.getProductType() == ProductType.PRODUCT) {
       productProducts.add(product);
    } else ...
}