我在基于Android的应用程序中有这些表,我正在使用OrmLite进行数据库管理。
我希望拥有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的混合。
答案 0 :(得分:1)
您是否有机会在构建查询时使用RTFM? ORMLite文档相当广泛:
您的问题是准备好的查询不能成为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 ...
}