簡體   English   中英

在一個語句中查詢多個表的房間數據庫

[英]Room Database query for multiple tables in one statement

如何為 Kotlin 中的房間數據庫提供 Dao 中多個表的一條語句? 我有這樣的代碼:

@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)

但第一個表后逗號有錯誤。 我在 Dao 中嘗試了 Transaction 或 @UPDATE 但沒有任何效果。

SQLite 的UPDATE只允許按照以下方式更新單個表:-

在此處輸入圖片說明

您要么需要運行多個更新(可能通過單個函數進行組合和驅動),要么您可以使用TRIGGER來在第一個表更新時更新第二個表。 請注意,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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM