【问题标题】:ORMLite union operatorORMLite 联合运算符
【发布时间】:2013-03-17 07:14:14
【问题描述】:

我必须在一个 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)

【问题讨论】:

  • “我不想一次性填充我的整个列表 [...] 延迟加载”我不确定您能否轻松实现这一目标。如果使用 ListView 和 CursorAdapter,则查询整个列表。没有分页/限制。 ListView 的回收东西纯粹是在视图上,而不是在底层数据上。

标签: android ormlite


【解决方案1】:

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

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

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

您不需要做更多的事情。

【讨论】:

  • 可以,是的,但我更喜欢以 ORMLite 为中心的解决方案。在我们的代码中没有其他地方使用原始 SQL,所以把它放在这里会很讨厌。
【解决方案2】:

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

使用 ORMLite 的最佳方法是使用 queryRaw(...) methods 之一。他们返回一个GenericRawResults class,您可以对其进行迭代。迭代器为您提供 number of different methods 以帮助您在列表中移动。

问题是通用结果不是特定类型,所以我不确定您是否可以将其映射到 Android ListView。您可以将RawRowMapper 提供给queryRaw(...)。您可以使用dao.getRawRowMapper() method 获取特定类型的映射器。

希望这里有帮助。

【讨论】:

  • 我会看看它是否可以创建一个包含RawRowMapper 的游标以使其与ListView 一起工作。
猜你喜欢
  • 2023-02-24
  • 2011-05-07
  • 2013-02-14
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多