ORMLite联合运算符

时间:2013-03-27 08:56:00

标签: android ormlite

我必须在一个Android ListView中提供三个表格。为了获取数据,我使用SQL UNION运算符将所有三个表“合并”在一起,这样在我的ViewBinder中我可以使每个时间轴项看起来不同。

这些项目需要按时间顺序排序。这三个表没有共同的基类。

这是我想到的SQL:

SELECT * FROM (
        SELECT id, startTime as time, username, comment, "CustomerInteraction" FROM CustomerInteraction  
        UNION 
        SELECT id, date as time, "" as username, "" as comment, "Sale" FROM Sale
        UNION 
        SELECT id, claimDate as time, username, comment,  "TravelClaim" FROM TravelClaim) 
    ORDER BY time DESC LIMIT 100

如何在ORMLite中表达上述查询?

我知道我可以使用Dao.executeRaw,但我不想一次性填充整个列表。我宁愿使用ORMLite中的trick to get the underlying cursor,然后将其传递给我的适配器。 (延迟加载,可以更快地初始显示长列表。)

有没有办法可以做Dao.getPreparedQueryFromRaw(String statement)之类的事情?或者更好QueryBuilder.union(QueryBuilder qb)

2 个答案:

答案 0 :(得分:2)

您可以通过在SQLiteDatabase上调用rawQuery来获取Cursor。我做这样的事情:

final SQLiteDatabase db = getHelper().getReadableDatabase();

Cursor cursor = db.rawQuery(MY_SQL_QUERY, null);

你不需要做更多的事情。

答案 1 :(得分:1)

  

有没有办法可以做Dao.getPreparedQueryFromRaw(String statement)之类的事情?或者更好的是QueryBuilder.union(QueryBuilder qb)?

使用ORMLite执行此操作的最佳方法是使用queryRaw(...) methods之一。他们返回GenericRawResults class,您可以迭代。迭代器为您提供number of different methods来帮助您移动列表。

问题是通用结果不属于某种类型,因此我不确定您是否可以将其映射到Android ListView。您可以提供RawRowMapperqueryRaw(...)。您可以使用dao.getRawRowMapper() method获取特定类型的映射器。

希望这里有所帮助。