アレディやった…
私がやったこと:テーブル用categories
CREATE TABLE categories (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100), parent NUMERIC)
作成されたテーブルcategories_closure
(すべての SQL ステートメントは SQLite 用です):
CREATE TABLE categories_closure (parent NUMERIC, child NUMERIC, depth NUMERIC)
次に、クロージャ テーブルを自動化するためのトリガーをいくつか作成しました
CREATE TRIGGER categories_delete AFTER DELETE ON categories
BEGIN
DELETE FROM categories_closure WHERE child=OLD.id;
UPDATE categories SET parent=OLD.parent WHERE parent=OLD.id;
END;
CREATE TRIGGER categories_insert AFTER INSERT ON categories
BEGIN
INSERT INTO categories_closure (parent, child, depth) VALUES (NEW.id, NEW.id, 0);
INSERT INTO categories_closure (parent, child, depth)
SELECT p.parent, c.child, p.depth+c.depth+1
FROM categories_closure p, categories_closure c
WHERE p.child=NEW.parent AND c.parent=NEW.id;
END;
CREATE TRIGGER categories_update AFTER UPDATE OF id,parent ON categories
BEGIN
DELETE FROM categories_closure WHERE child=OLD.id;
INSERT INTO categories_closure (parent, child, depth) VALUES (NEW.id, NEW.id, 0);
INSERT INTO categories_closure (parent, child, depth)
SELECT p.parent, c.child, p.depth+c.depth+1
FROM categories_closure p, categories_closure c
WHERE p.child=NEW.parent AND c.parent=NEW.id;
UPDATE categories SET parent=NEW.id WHERE parent=OLD.id;
END;
これで、簡単なクエリですべての親カテゴリの文字列を取得できます。ビューを作成しました
CREATE VIEW categories_resolved AS
SELECT
id,
group_concat(name, ' ') AS fullname,
group_concat(parent) AS branch
FROM (
SELECT
c.id,
cc.parent,
c2.name
FROM categories c
LEFT JOIN categories_closure cc ON c.id=cc.child
LEFT JOIN categories c2 ON c2.id=cc.parent
ORDER BY cc.depth DESC
)
GROUP BY id
ORDER BY id ASC
そして最後に、テーブルQSqlRelationalTableModel
の代わりにリレーションでこのビューを使用しました。categories
シンプルで、Qt クラスのモデル、ビュー、プロキシ、デリゲート、またはコードを変更する必要はありません。