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 不支持通过注释生成触发器,因此您必须通过回调(onCreate
或 onOpen
)引入这些触发器。
这是一个触发器的例子:-
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)
如何在 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 不支持通过注释生成触发器,因此您必须通过回调(onCreate
或 onOpen
)引入这些触发器。
这是一个触发器的例子:-
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)