Room Database 在一个语句中查询多个表

Room Database query for multiple tables in one statement

如何在 Kotlin 的 Room Database 中为 Dao 中的多个 table 提供一条语句? 我有这样的代码:

@Query("UPDATE cis06zebraz, cis06zebrap 
SET cis06zebraz.stav = 1,cis06zebrap.stav=1 
WHERE cis06zebraz.doklad=cis06zebrap.doklad 
AND cis06zebraz.exp = cis06zebrap.exp 
AND cis06zebraz.stav = 0 
AND cis06zebraz.zebra = :zebra")
fun updDatabase(zebra:String)

但是第一个table后面的逗号有错误。我在 Dao 中尝试了 Transaction 或 @UPDATE 但没有任何效果。

SQLite 的 UPDATE 只允许按照 :-

更新单个 table

您要么需要多个更新 运行(可能通过单个函数组合和驱动),要么您可以利用 TRIGGER 在第一个时更新第二个 table已更新。请注意,Room 不支持通过注释生成触发器,因此您必须通过回调(onCreateonOpen)引入这些触发器。

这是一个触发器的例子:-

DROP TABLE IF EXISTS cis06zebraz;
DROP TABLE IF EXISTS cis06zebrap;
CREATE TABLE IF NOT EXISTS cis06zebraz (stav,doklad,exp,zebra);
CREATE TABLE IF NOT EXISTS cis06zebrap (stav,doklad,exp);
/*<<<<< THE TRIGGER >>>>>*/
CREATE TRIGGER IF NOT EXISTS cis06zebrap_update_after_cis06zebraz_update 
    AFTER UPDATE OF stav ON cis06zebraz
    BEGIN
        /* NOTE that new. represents values from the updated table */
        UPDATE cis06zebrap SET stav = 1 WHERE cis06zebrap.doklad = new.doklad AND cis06zebrap.exp = new.exp;
    END
;
/* Add some testing data  3 rows into Z table*/
INSERT INTO cis06zebraz VALUES (0,1,'x','zebra');
INSERT INTO cis06zebrap VALUES (0,1,'y');
INSERT INTO cis06zebrap VALUES (0,1,'x');
/* 2 rows into P table */
INSERT INTO cis06zebraz VALUES (0,2,'x','zebra');
INSERT INTO cis06zebrap VALUES (0,2,'y');
/* Display the original data */
SELECT 'Z' AS i,* FROM cis06zebraz UNION SELECT 'P',*,'n/a' FROM cis06zebrap ORDER BY doklad,i DESC;
/* Do the Update */
UPDATE cis06zebraz SET stav = 1 WHERE doklad = 1;
/* Display the  data after the update */
SELECT 'Z' AS i,* FROM cis06zebraz UNION SELECT 'P',*,'n/a' FROM cis06zebrap ORDER BY doklad,i DESC;
/* Cleanup the testing environment */
DROP TRIGGER IF EXISTS cis06zebrap_update_after_cis06zebraz_update; /*(no need as trigger should be dropped when table is)*/
DROP TABLE IF EXISTS cis06zebraz;
DROP TABLE IF EXISTS cis06zebrap;

更新前的第一个查询显示:-

即所有行的 stav 列中都有 0。

更新之后:-

可以看出,doklad 1 的 Z 行(突出显示)已更新,P 行之一已根据 doklad 1(突出显示)更新。但是,doklad 1 的 P 行 exp y 尚未被触发器更新(因为 new.exp 等于 x)