2013-07-22 36 views
0

我在基於Android的應用程序中使用OrmLite進行數據庫管理時使用了這些表。OrmLite:高級其中邏輯

enter image description here

我想這取決於有多少產品類型FOLDER我有有數組列表的x號是什麼。

所以在這種情況下,我想要一個productId等於parentId的產品列表。 所以我希望有一個列表,其中

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

基本上我想結束了,在這種情況下,三個列表,每個包含的產品列表,其中parentId的是每一個產品相同。

我已經嘗試了很多東西,並且其中一些比其他的更好,但是我想運行的代碼實際上會拋出一個空指針。

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

您是否有機會圍繞建築查詢使用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 ... 
} 
+0

我在找什麼,我喜歡縮寫RTFM。 –

+1

RTFM是舊派。很多較新的黑客甚至不知道它@JoakimEngstrom。 :-) – Gray