Home » Tutorials » Datenbanken » Object Persistence Framework

Object Persistence Framework

Eine kleine Erweiterung

Für den Einstieg bauen wir noch eine kleine Erweiterung ein: Zu jeder Adresse sollen beliebig viele Kontaktinformationen (Telefon, ICQ,…) gespeichert werden können. Dazu erstellen wir erst einmal eine entsprechende Klasse im IO Model Explorer (STRG+Shift +M):

Ganz wichtig diesmal: Die Eingeschaft „Persistence“ auf „Embedded“ stellen. Bei der Adresse erzeugen wir im Model Explorer eine neue Eigenschaft „Verbindungen“ vom Typ „Parts“, stellen die Eigenschaft „ObjectClass“ auf TVerbindung und die Eigenschaft „StorageKind“ auf „Embedded“.
Die Oberfläche erweitern wir um ein weiteres DataSource, ein DBGrid und einen weiteren DBNavigator. Das Grid und den zweiten DBNavigator verbinden wir mit dem neuen DataSource. Von Komponentenregister „InstantObjects“ folgt ein „TInstantExposer“.
Folgende Eingeschaften von TInstantExposer setzen:
MasterSource = DataSourceAdresse (die DataSouce die mit dem InstantSelector
verbunden ist).
ContainerName = Verbindungen
Mode = amContent
ObjectClassName = TVerbindung
Nun müssen wir aber noch die DB überarbeiten. Dazu den DatabaseBuilder aufrufen (2. Icon im „Instant Model Explorer“. Diesmal rufen wir aber nicht die „Build“ Funktion auf, sondern die „Evolve“. Das Fenster sieht aus, die das Fenster in dem die Datenbank erzeugt wurde. Hier einfach auf die Buttons „Show Evolution Sequence“ und dann „Evolve Database“ klicken.
Dadurch können die schon eingegebenen Daten erhalten bleiben. Um diese Änderung beim Anwender durchzuführen stellt IO die beiden Komponenten TInstantDBBuilder und TInstantDBEvolver bereit.
Jetzt im OnCreate Ereignis noch den InstantExposer öffnen (InstantExposer1.Open;) und das Programm starten und genießen! Mit sehr wenigen Handgriffen haben wir die Anwendung um ein Master-Detail Element erweitert.
Allerdings führt dieses Vorgehen (andere Klassen als „Embedded“ zu speichern) zu Problemen (s. External_Storage.txt in den Docs von IO): Die Daten werden innerhalb binärer Blobs in den Tabellen gespeichert. Es ist nicht möglich in bestimmten Fällen auftretende fehlerhafte Blobs zu reparieren und es ist nicht möglich per SQL entsprechende Felder abzufragen. Aus diesem Grund wurde für die Version 2 auch die Möglichkeit eingeführt Parts bzw. References in eigenen Tabellen zu speichern.
Um das bestehende Projekt zu ändern sind folgende Schritte notwend

  1. Ändern der Eigenschaft Persistence der Klasse TVerbindung auf „Stored“ (im IOExplorer die Klasse TVerbindung editieren)
  2. Löschen des Feldes „Verbindungen“ in der Klasse TAdresse
  3. Neues Feld definieren „Verbindungen“ bei TAdresse, diesmal aber mit der
    Eigenschaft „Storage Kind“ auf „External“
  4. Datenbank neu erstellen bzw. überarbeiten (Evolve)

Auch den InstantExposer müssen wir neu einstellen: Bei den FieldOptions muss „Objects“ auf „true“ umgestellt werden.
Nun werden die Verbindungen in einer eigenen Tabelle gespeichert und sind damit auch über SQL vernünftig auswertbar.