Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Adatbáziskezelés M/V architektúrában

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Adatkezelés speciális eszközökkel. Giachetta Roberto

Adatok speciális megjelenítése

3. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III.

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Választó lekérdezés létrehozása

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 2/3

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés elemi eszközökkel. A MySQL adatbázis-kezelő

Elemi alkalmazások fejlesztése IV.

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Elemi adatbázis kezelés

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Adatbázis-kezelés elemi eszközökkel. Giachetta Roberto

2. Beadandó feladat dokumentáció

3. Beadandó feladat dokumentáció

MTMT adminisztrátori felület és teendők. Mátyás Melinda, Szabó Panna november 4. ELTE Egyetemi Könyvtár

Adatbázis-kezelés Access XP-vel. Tanmenet

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

PHP-MySQL. Adatbázisok gyakorlat

Készítsen egy adatbázist (egytáblásat) egy számítástechnikai tanfolyam résztvevőiről. Az adattábla rögzítse a következőket:

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

Haladó irodai számítógépes képzés tematika

1. Az Access 2000 indítása után válasszuk az Üres adatbázis létrehozása pontot,

2. Beadandó feladat dokumentáció

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

HVK Adminisztrátori használati útmutató

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

Swing GUI készítése NetBeans IDE segítségével

Java Programozás 11. Ea: MVC modell

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

ABAP dictionary objektumok SAP adatmodell Táblák kezelése. Az SAP programozása 1. Tarcsi Ádám

SQL DDL-2 (aktív elemek) triggerek

Táblázatok kezelése. 1. ábra Táblázat kezelése menüből

Adatbázis-kezelés ActiveX vezérl kkel 2.rész

Az SQL*Plus használata

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Elemi alkalmazások fejlesztése III.

Bevezetés: az SQL-be

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Adatbázis-kezelés az Excel 2013-ban

Access gyakorlati feladatok lépésről lépésre

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

Térképek jelentése és elemzése

Az ErdaGIS térinformatikai keretrendszer

A szürke háttérrel jelölt fejezet/alfejezet szövege a CD-mellékleten található. A CD-melléklet használata. 1. Elméleti áttekintés 1

3. Ezután a jobb oldali képernyő részen megjelenik az adatbázistábla, melynek először a rövid nevét adjuk meg, pl.: demo_tabla

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, Quantum GIS program alkalmazásával Útmutató 2010.

Adatbázis kezelés Delphiben. SQL lekérdezések

Lekérdezések I. Egyszerű választó lekérdezések

Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió

3. modul - Szövegszerkesztés

Felhasználói dokumentáció. a TávTagTár programhoz. Készítette: Nyíri Gábor, hdd@nc-studio.com GDF Abakusz regisztrációs kód: GDFAba43

Táblázatkezelés Excel XP-vel. Tanmenet

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

SEGÉDLET ADATKEZELÉS MS EXCEL-BEN. Tároljuk az adatokat Excel munkalapon. Megjegyzés: A feladatokat MS Office Excel ban oldottuk meg.

Entity Framework alapú adatbáziselérés

KTI Közlekedéstudományi Intézet Nonprofit Kft. Vasúti Vizsgaközpont

2 Access 2016 zsebkönyv

WordPress segédlet. Bevezető. Letöltés. Telepítés

Duál Reklám weboldal Adminisztrátor kézikönyv

Parlagfű Bejelentő Rendszer

Táblázatok. Táblázatok beszúrása. Cellák kijelölése

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Programozási technológia

Hozzávalók keresése és csatolása

Fogalmak: Adatbázis Tábla Adatbázis sorai: Adatbázis oszlopai azonosító mező, egyedi kulcs Lekérdezések Jelentés Adattípusok: Szöveg Feljegyzés Szám

Adatbázis, adatbázis-kezelő

Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve. Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba

Felhasználói segédlet a Scopus adatbázis használatához

Prezentációkészítés PowerPoint XP-vel

BŐVÍTMÉNYEK TELEPÍTÉSE ÉS SZERKESZTÉSE WORDPRESS-BEN

Kézikönyv. Fizetési feltétel kulcs felvitele

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

A webáruház kezdőlapján háromféle diavetítés beállítására van lehetőség:

Lekérdezések az SQL SELECT utasítással

Könyvtári nyilvántartás

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

KUTATÁSTÁMOGATÁS SOROZAT. Felhasználói segédlet Academic Search Complete adatbázisban idézők kereséséhez

Access alapok. Megnevezés Művelet Minta. Új adatbázis létrehozása. Új / Üres adatbázis.. Tábla létrehozása tervező nézetben.

ContractTray program Leírás

On-line képzési program nyilvántartás

Teljesítményértékelések eredményeinek rögzítése a Neptun Egységes Tanulmányi Rendszerben

PwC EKAER Tool felhasználói leírás május

VARIO Face 2.0 Felhasználói kézikönyv

A d m i n i s z t r á c i ó s f e l a d a t o k a I n t e g r á l t K ö n y v t á r i R e n d s z e r b e n

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

QGIS Gyakorló. 1. kép. A vektor réteg (grassland.shp).

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

Operációs rendszerek. Tanmenet

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése I 8. előadás Adatbázis-kezelés modell/nézet architektúrában 2013.04.17. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

A modell/nézet architektúra Az összetettebb alkalmazásoknál célszerű a kétrétegű architektúrát bevezetni, amelyet a modell/nézet (Model/View) architektúrának nevezünk felhasználó nézet alkalmazás modell Adatkezelő alkalmazásoknál ez több szempontból is hasznos lehet, pl.: az adatkezelést könnyen átalakíthatóvá teszi az adatmegjelenítést egyedire szabhatjuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:2

A Qt koncepciója A Qt 4 magába ágyazta a modell/nézet architektúrát adatkezelésre, így beépített elemek használatával is elérhető az alkalmazás rétegelt felépítése a modell biztosít osztályokat a különböző adatforrások olvasására, írására, pl. listák, XML fájlok, adatbázisok, fájlrendszer, a nézet különböző megjelenítő grafikus vezérlőket tartalmaz, pl. listák, táblázatok, a két réteg pontos összeillesztését a delegált (delegate) osztályok felügyelik, amelyek meghatározzák, milyen módon jelenjenek meg az adatok ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:3

A Qt koncepciója lista megjelenítő tábla megjelenítő fa megjelenítő nézet delegált nézet modell lista modell fájlrendszer modell adatbázis modell szöveg listák fájlrendszer adatbázis ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:4

Adattársítás és indexelés A felületen a nézetek mellett egyéb grafikus vezérlők is kezelhetik az adatokat, amennyiben megfelelő adattársítást (data binding) biztosítunk a vezérlő és a modell között Egy modell tetszőlegesen sok különböző felületi elemhez kapcsolható, különböző nézetek és adattársítások használatával Az adatközlés a felület és a modell között indexek segítségével történik, amely az adatok lokalizálására szolgál típusa a QModelIndex, mely lehetőséget ad a modell tetszőleges adatának hierarchikus elérésére különböző szerepeket adhat az adatokat, úgymint tartalmazás, vagy megjelenítés ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:5

Adattársítás és indexelés felületi vezérlő táblamegjelenítő modell indexek vezérlő adattársítás nézet delegált adatbázis modell parancs objektumok adatbázis kapcsolat adatbázis ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:6

Adatbázis-kezelő modellek A modellek a QAbstractItemModel leszármazottai, ezek közül adatbázis-kezelésre 3 alkalmazható: QSqlQueryModel: egy lekérdezés eredményének listázására QSqlTableModel: egy tábla írására és olvasására QSqlRelationalTableModel: idegen kulcsokat tartalmazó tábla kezelésére alkalmazható, további táblákból begyűjtött adatokkal QAbstractItemModel QSqlQueryModel QSqlTableModel QSqlRelationalTableModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:7

Lekérdezés modellek Amennyiben egyszerű olvasást akarunk végezni, a QSqlQueryModel biztosít megfelelő műveleteket, pl.: QSqlQueryModel model; model.setquery("select "); // lekérdezés beállítása model.setheaderdata(0, Qt::Horizontal, "Id"); // oszlop fejlécének beállítása model.setheaderdata(1, Qt::Horizontal, "Data"); a setquery() metódussal beállíthatunk tetszőleges lekérdezést (szövegesen, vagy a parancsobjektumot) a sorok számát a rowcount(), az oszlopok számát a columncount() metódussal kérdezhetjük le ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:8

Lekérdezés modellek a record(<sor>) művelet tetszőleges sorát lekérdezi a modellnek, amely QSqlRecord típusú lesz, amelynek elérhetjük mezőit (value(<oszlop>)) az index(<sor>, <oszlop>) művelet tetszőleges elemét lekérdezi a modellnek, ami QModelIndex típusú lesz, aminek elérhetjük az adatrészét (data()) Modellek megjelenítéséhez a QAbstractItemView leszármazottait kell használnunk, táblázatos megjelenítéshez a QTableView osztályt, pl.: QTableView view; view.setmodel(model); // modell beállítása view.show(); // megjelenítése ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:9

Példa Feladat: Készítsük el az apartman adatbázis épületeinek (buildings) grafikus megjelenítését. az alkalmazáshoz nem kell egyetlen új osztályt se definiálnunk, a létező típusok felhasználásával megoldható a feladat az ablakban egy táblamegjelenítőben jelenjen meg a tábla teljes tartalma, ehhez egy QTableView példányt alkalmazunk az adatok betöltését egy lekérdező modellel végezzük (QSqlQueryModel), amely megkapja a megfelelő lekérdezést, és lefuttatja a lekérdező műveleteket (QSqlQuery) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:10

Példa Tervezés (adatbázis): ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:11

Példa Tervezés (alkalmazás): class BuildingQuery QAbstractItemView -model QAbstractItemModel QTableView QSqlQueryModel -query QSqlQuery ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:12

Példa Megvalósítás (main.cpp): int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("MYSQL"); // adatbázis-kapcsolat létrehozása QSqlQueryModel* model = QSqlQueryModel; // lekérdezési modell model->setquery("select * from building"); // lekérdezés beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:13

Példa Megvalósítás (main.cpp): model->setheaderdata(0, Qt::Horizontal, trutf8("azonosító")); // fejlécek beállítása QTableView* tableview = new QTableView; // táblamegjelenítő tableview->setmodel(model); // modell beállítása a megjelenítőhöz tableview->show(); } return a.exec(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:14

Indexek használata A modellen belüli adatok kezelését indexek (QModelIndex) segítségével tehetjük meg minden elemnek a modellünkben saját indexe van, saját címmel, amely a modell felépítésétől függ ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:15

Indexek és megjelenítő használata az indexhez tartozó adatot a data() metódussal kérhetjük le az index sorral (row()) és oszloppal (column()) rendelkezik, fák esetén az indexnek lehetnek gyerek (child(<sorszám>)), illetve szülő (parent()) elemei is Az indexeket a nézetben is használhatjuk a kiválasztás módját a setselectionbehavior(<viselkedés>) és setselectionmode(<mód>) műveletekkel szabályozzuk a setcurrentindex(<index>) a kijelölést állítja az edit(<index>) művelettel szerkeszthetővé tehetünk egy elemet, az update(<index>) frissíti az adott tartalmat ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:16

Szerkesztő modellek Egy tábla adatbázisbeli tábla lekérdezését és szerkesztését a QSqlTableModel osztály biztosítja, amely számos további szolgáltatást nyújt a settable(<táblanév>) művelettel állíthatunk be egy táblát adatforrásnak, a select() művelet szolgál az adatok lekérdezésére adatot beállítani a setdata(<index>, <adat>) metódussal tudunk lehetőségünk van tetszőlegesen rendezni az adatokat a setsort(<oszlop>, <rendezési mód>) művelettel az insertrow(<sor>) beszúr egy üres sort a megadott helyre, a removerow(<sor>) töröl egy sort ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:17

Szerkesztő modellek Pl.: QSqlTableModel *model; // modell QTableView *view; // nézet model->settable("mytable"); // tábla beállítása model->setsort(0, Qt::AscendingOrder); // rendezés model->select(); // adatok betöltése int row = view->currentindex().row(); // kijelölt sor lekérdezése model->insertrow(row); // új sor beszúrása QModelIndex index = model->index(row, 0); // index létrehozása a sor első oszlopára model->setdata(index, 100); // adat beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:18

Példa Feladat: Készítsünk alkalmazást, amely alkalmas az épületek szerkesztésére, új épület létrehozására, törlésére. a táblaszerkesztést egy ablakba (TableModelDialog) helyezzük, amelyhez felvesszük a hozzáadás és törlés gombjait, a táblakezeléshez használjunk QSqlTableModel-t, a megjelenítéshez QTableView-t beszúráskor lekérdezzük a kijelölt sor indexét, behelyezünk egy sort a helyére, átállítjuk a kijelölést (az indexen keresztül), majd szerkesztésre váltunk törléskor töröljük a kijelölt sort, és áthelyezzük a kijelölést ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:19

Példa Tervezés: class BuildingEditor QDialog BuildingEditorDialog - _addbutton :QPushButton* - _buttonbox :QDialogButtonBox* - _model :QSqlTableModel* - _removebutton :QPushButton* - _tableview :QTableView* + ~BuildingEditorDialog() :void + BuildingEditorDialog(QWidget*) - setupmodel() :void - setupui() :void «slot» - addbutton_clicked() :void - removebutton_clicked() :void -_tableview -_model QTableView QSqlTableModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:20

Példa Megvalósítás (main.cpp): int main(int argc, char *argv[]){ QApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); if (db.open()) { // kapcsolat megnyitása BuildingEditorDialog *w = new BuildingEditorDialog(); w->show(); // ablak megnyitása } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:21

Példa Megvalósítás (buildingeditordialog.cpp): void BuildingEditorDialog::setupModel() { _model = new QSqlTableModel(this); // táblamodell létrehozása _model->settable("building"); // tábla beállítása model->setsort(1, Qt::AscendingOrder); // rendezési sorrend model->setheaderdata(0, Qt::Horizontal, trutf8("azonosító")); model->select(); // adatok begyűjtse ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:22

Példa Megvalósítás (buildingeditordialog.cpp): void BuildingEditorDialog::setupUi() { tableview = new QTableView(this); tableview->setmodel(model); // modell hozzákapcsolása a megjelenítőhöz tableview->setselectionbehavior( QAbstractItemView::SelectItems); // kijelölés módja tableview->resizecolumnstocontents(); // oszlopok automatikus méretezése } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:23

A szinkron és aszinkron adatbázis-kezelés A szerkesztési stratégia függvényében kétféle megközelítést alkalmazhatunk az adatkezelésben: szinkron (állandó kapcsolatú) modell: az adatbázis és a modell tartalma folyamatosan (legalábbis rekordváltásonként) egyezik, ez az automatikus szerkesztési stratégia aszinkron (bontott kapcsolatú) modell: az adatbázis és a modell tartalma különbözhet, és csak meghatározott pontokon egyezik meg (select, submitall, revertall), ez a manuális szerkesztési stratégia A gyakorlatban az aszinkron modell az elterjedtebb, mivel nem igényel állandóan az adatbázis műveletek futtatását ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:24

Szerkesztési stratégia A szerkeszthető modell lehetőséget ad a szerkesztési stratégia beállítására, azaz, hogy mikor kerüljenek be a módosítások a fizikai adatbázisba a modell a módosításokat első lépésben csak a memóriában végzi el, utána menti vissza azokat az adatbázisba a módosítás fennállását az isdirty(<index>) metódussal kérhetünk le, ez igazat ad, amennyiben az adat eltér az adatbázisban tárolttól egy sort, vagy adatot menteni a submit(), a teljes tartalmat menteni a submitall() utasítással tudunk lehetőségünk van változtatások visszavonására is revert() és revetall() metódusokkal ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:25

Szerkesztési stratégia a seteditstrategy(<stratégia>) függvényével definiálhatjuk a visszamentés módját, ez a következő lehetnek: OnFieldChange: amint váltjuk a mezőt, automatikusan meghívja a submit() utasítást OnRowChange: amint váltjuk a sort, automatikusan meghívja a submit() utasítást OnManualSubmit: nem történik változtatás, amíg meg nem hívjuk a mentés (submitall()) vagy visszavonás (revertall()) műveletét a mentő műveletek hamissal térnek vissza sikertelen mentéskor, ekkor a lasterror() tartalmazza a hibát ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:26

Tranzakciók Amennyiben az adatbázis támogatja a tranzakciók kezelését, lehetőségünk van több utasítás egyszeri futtatására db.transaction(); // tranzakció kezdete // utasítások if (/* minden utasítás igazzal tér vissza */) db.commit(); // tranzakció végrehajtása else db.rollback(); // tranzakció visszavonása a tranzakció kezdetét a kapcsolat transaction() metódusával jelezhetjük, ezt követően célszerű ellenőrizni az utasítások sikerességét a tranzakció végrehajtását a commit(), visszavonását a rollback() művelettel érhetjük el ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:27

Tranzakció alapú szerkesztés A submitall() utasítás visszaadja, hogy sikeres volt-e a mentés, azonban önmagában nem garantál tranzakciót, tehát amennyiben valamely utasítás elakad menet közben, akkor a módosítások egy része lefut, ha ezt meg akarjuk akadályozni, akkor helyezzük tranzakcióba a végrehajtást Pl.: model->database().transaction(); // tranzakció if (model->submitall()) // módosítások mentése model->database().commit(); // ha sikerül, véglegesítünk else model->database().rollback(); // különben visszavonunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:28

Relációs szerkesztő modellek A QSqlRelationalTableModel osztály lehetőséget ad táblák közötti relációk kezelésére Pl.: a setrelation(<oszlop>, <reláció>) metódussal beállíthatunk relációt egy adott oszlopra a reláció típusa QSqlRelation, megadja a tábla nevét, a forrás (társított), valamint a cél (megjelenített) oszlopot QSqlRelationalTableModel model; // modell model.settable("mytable"); // tábla beállítása model.setrelation(2, QSqlRelation("otherTable",0,1)); // reláció megadása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:29

Relációs szerkesztő modellek A társított adatokat nem csak szövegesen, hanem legördülő menü segítségével is megjeleníthetjük Pl.: ehhez a megjelenítő delegált osztályt az alapértelmezettről a QSqlRelationalDelegate példányra kell lecserélnünk a nézet osztály setitemdelegate(<delegált>) metódusa változtatja a megjelenítést QTableView view; view.setmodel(model); // modell beállítása view.setitemdelegate(new QSqlRelationalDelegate()); // nézet delegált beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:30

Példa Feladat: Módosítsuk az épületek szerkesztését úgy, hogy a városokat hozzácsatoljuk az megjelenítéshez ehhez relációs adatmodellt kell használnunk, amely létrehozza a relációt a városok táblával (city), az épületekbeli azonosítót (city_id) kötve az azonosítóhoz (id), és helyette megjelenítve a nevet (name) a megjelenítéshez lecseréljük a delegáltat is relációsra az adatok mentését manuálisan valósítjuk meg tranzakciók segítségével ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:31

Példa Tervezés (adatbázis): ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:32

Példa Tervezés (alkalmazás): class BuildingEditorWithCities BuildingEditorDialog QDialog - _addbutton :QPushButton* - _buttonbox :QDialogButtonBox* - _model :QSqlRelationalTableModel* - _removebutton :QPushButton* - _revertbutton :QPushButton* - _submitbutton :QPushButton* - _tableview :QTableView* + ~BuildingEditorDialog() :void + BuildingEditorDialog(QWidget*) - setupmodel() :void - setupui() :void «slot» - addbutton_clicked() :void - removebutton_clicked() :void - submitbutton_clicked() :void -_tableview QTableView QSqlRelationalDelegate -_model QSqlRelationalModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:33

Példa Megvalósítás (buildingeditordialog.cpp): _model = new QSqlRelationalTableModel(this); _model->setrelation(2, QSqlRelation("city", "id", "name")); // reláció beállítása egy oszlophoz _tableview = new QTableView(this); _tableview->setitemdelegate( new QSqlRelationalDelegate()); // megjelenítés módjának definiálása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:34

Példa Megvalósítás (buildingeditordialog.cpp): void BuildingEditorDialog::submitButton_Clicked(){ _model->database().transaction(); if (model->submitall()) { // végrehajtjuk a módosításokat _model->database().commit(); } else { _model->database().rollback(); QMessageBox::warning(this, trutf8("hiba történt a mentéskor!"), trutf8("az adatbázis a következő hibát jelezte: %1").arg(model->lastError().text())); } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 8:35