Sum()函数在Room数据库android中不起作用

Posted

技术标签:

【中文标题】Sum()函数在Room数据库android中不起作用【英文标题】:Sum() function with over not work in Room database android 【发布时间】:2021-07-30 08:05:52 【问题描述】:

谁能帮我以下查询在 DB Browser 中运行良好,但不适用于 Room 数据库。这是表格和查询:

Transaction:

id amount is_credit

查询:

SELECT * 
FROM 
    (SELECT 
         id, amount, 
         SUM(CASE WHEN is_credit = 1 THEN amount ELSE -amount END) OVER (ORDER BY id) AS balance 
     FROM `Transaction`) 
ORDER BY 
    id DESC;

我已尝试使用 SimpleSQLiteQuery 进行此查询,但出现错误:

E/SQLiteLog: (1) "(" 附近:语法错误

【问题讨论】:

【参考方案1】:

如果您的 SQLite 版本低于 3.25.0,则不能像 SUM() 一样使用 window functions。

相反,您可以使用相关子查询来做到这一点:

SELECT t.id, 
       t.amount,
       (SELECT SUM(CASE WHEN tt.is_credit = 1 THEN 1 ELSE -1 END * tt.amount) FROM `Transaction` tt WHERE tt.id <= t.id) AS balance 
FROM `Transaction` t
ORDER BY t.id DESC;

或自加入:

SELECT t.id, 
       t.amount,
       SUM(CASE WHEN tt.is_credit = 1 THEN 1 ELSE -1 END * tt.amount) AS balance 
FROM `Transaction` t INNER JOIN `Transaction` tt
ON tt.id <= t.id
GROUP BY t.id
ORDER BY t.id DESC;

查看简化的demo。

【讨论】:

【参考方案2】:

您正在尝试使用 SQLite Windows 函数,即 OVER android 设备上的 SQLite 版本通常落后一些。对于 SQLite 版本 3.28.0(引入 Windows 函数时),您至少需要 API 30 (Android R)。显然,这会限制应用的安装基础。

你不妨看看Version of SQLite used in Android?

【讨论】:

了解问题,您能帮我解决相同查询的替代解决方案吗?如何将相同的结果归档到另一个查询中。

以上是关于Sum()函数在Room数据库android中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android Room Dao:按 CASE 排序不起作用

stream() 方法在android中不起作用

构造函数的@injection 在Android中不起作用

scrollTop 在 Android 手机中不起作用

navigator.camera.getPicture 在 android 中不起作用

自动读取 SMS Pin 在数字 android 中不起作用