0

我有三个表,我必须在一个 Android 中呈现ListView。为了获取数据,我使用 SQLUNION运算符将所有三个表“合并”在一起,以便在我的 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,但我不想一次性填充我的整个列表。我宁愿使用这个技巧从 OR​​MLite 获取底层光标,然后将其传递给我的适配器。(延迟加载,使长列表的初始显示速度更快。)

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

4

2 回答 2

2

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

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

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

你不需要做更多的事情。

于 2013-03-27T08:58:56.353 回答
1

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

使用 ORMLite 执行此操作的最佳方法是使用其中一种queryRaw(...)方法。它们返回一个您可以迭代的GenericRawResults类。迭代器为您提供了许多不同的方法来帮助您在列表中移动。

问题是通用结果不是某种类型,所以我不确定你是否可以将它映射到 AndroidListView中。您可以提供RawRowMapperqueryRaw(...). dao.getRawRowMapper()您可以使用方法获取特定类型的映射器。

希望这里有帮助。

于 2013-03-27T13:25:02.150 回答