Datenmanagement in Android-Apps 16. Mai 2013
Überblick Strukturierung von datenorientierten Android-Apps Schichtenarchitektur Möglichkeiten der Datenhaltung: in Dateien, die auf der SDCard liegen in einer internen OrmLite-Datenbank DB-Schema über Annotationen in Java-Klassen Bereitstellung von Datenzugriffsklassen Einfache Unterstützung für Anfragen in einer Datenbank auf einem externen Server Zugriff innerhalb eines separaten Threads MySQL-Datenbank Zugriff über die Schnittstelle JDBC Taentzer Software-Praktikum 2013 69
Schichtenarchitektur Oberfläche: Durch Activities realisiert objektorientierter Zugriff: Datenklassen Separate Klassen für den Datenzugriff Datenhaltung: In Dateien oder Datenbank Eigenschaften: Klare Trennung zwischen Datenhaltung und -nutzung objektorient. Sicht auf die Daten meist keine separierte Anwendungslogik Oberfläche objektorientierter Zugriff Datenhaltung Taentzer Software-Praktikum 2013 70
Zusammenhang: Objektorientiertes Modell relationale Datenbank Klasse mit Attributen Objekt zu einer Klasse 1-1 Assoziation zwischen Klassen A und B 1-n Assoziation von Klasse A nach B n-m Assoziation zwischen Klassen A und B Tabelle mit Spalten, eine spezielle Id-Spalte Zeile (Datensatz) einer Tabelle weitere Spalte in Tabelle A mit B_Id (oder umgekehrt) weitere Spalte in Tabelle B mit A_id weitere Tabelle mit zwei Spalten A_Id und B_Id Taentzer Software-Praktikum 2013 71
OrmLite-Datenbanken Object Relational Mapping Lite bietet eine leichtgewichtige Lösung für das Persistieren von Java-Objekten in SQL Datenbanken. Erstellen einer neuen OrmLite-Datenbank erstelle eine neue Unterklasse von OrmLiteSqliteOpenHelper überschreibe oncreate() und erzeuge die Datenbank überschreibe onupgrade() für Schemamigration Erstellen des Datenbankschemas Das DB-Schema wird aufgrund von Annotationen an Datenklassen automatisch erstellt. Taentzer Software-Praktikum 2013 72
Annotation von Klassen um Persistenzinformationen Persistenz einer Klasse in einer Tabelle: @DatabaseTable Setzen eines Tabellennamens: @DatabaseTable(tableName = clicks ) Persistenz eines Feldes in einer Spalte: @DatabaseField Persistenz als Schlüssel: @DatabaseField(id = true) Weitere Informationen: columnname, defaultvalue, canbenull, generatedid, foreign, unique ClickCount.java: Taentzer Software-Praktikum 2013 73
Erzeugen einer neuen Datenbank geschieht in einer Klasse, die von OrmLiteSqliteOpenHelper erbt. DatabaseHelper.java: DB-Name und Version setzen Datenzugriffsobjekte definieren Taentzer Software-Praktikum 2013 74
Erzeugen einer neuen Datenbank Erzeugen mit oncreate(), Ändern mit onupgrade() DatabaseHelper.java: Einfachste Änderung: Alte Tabellen löschen und neu anlegen Taentzer Software-Praktikum 2013 75
Datenzugriffsobjekte Engl.: Data Access Object (DAO) Für einfache Zugriffe auf Datenobjekte zuständig: CRUD: Create, Read, Update, Delete abstrahiert von der konkreten Datenhaltung Für jeden Typ von Datenobjekt gibt es ein DAO. ein Singleton-Objekt Generischer Typ: Dao<T,ID> T Typ des Datenobjekts ID Typ der Identifier (z.b. Integer) DatabaseHelper.java: Taentzer Software-Praktikum 2013 76
Einlesen der Persistenzinformation geschieht in einer Klasse, die von OrmLiteConfigUtil erbt. DatabaseConfigUtil.java: Datei wird automatisch aus der Persistenzinformation erzeugt. Taentzer Software-Praktikum 2013 77
Benutzung der DAOs CreateCounter.java: DAO holen Objekt holen Geändertes Objekt persistieren Taentzer Software-Praktikum 2013 78
Benutzung der DAOs DAO-Nutzung innerhalb von trycatch-blöcken CreateCounter.java: Persistierung eines neuen Datenobjekts Taentzer Software-Praktikum 2013 79
Benutzung von DAOs CreateCounter.java: Abrufen aller Datenobjekte eines Typs mit queryforall Taentzer Software-Praktikum 2013 80
Komplexere Anfrage mit DAOs CreateCounter.java: Vorteil: Typsicherheit Maximale Anzahl von Zeilen Entsprechende SQL-Anfrage: SELECT * FROM ClickCount ORDER BY DATE_FIELD_NAME Taentzer Software-Praktikum 2013 81
Weitere hilfreiche Klassen zur Verwaltung von Daten ConnectionSource Datenquelle für eine Datenbankverbindung DaoManager zum Erzeugen und Verwalten von DAO-Objekten TableUtil zum Erzeugen, Löschen und Verwalten von Tabellen Taentzer Software-Praktikum 2013 82
DaoManager Zur Erzeugung eines DAO-Objekts ohne spezielle DAO- Klasse. Beispiel: Erzeugen einer Datenquelle für eine bestimmte Datenbank ConnectionSource myconnection = null; myconnection = new JdbcConnectionSource(myUrl,myUser,myPass); Erzeugen eines DAO für eine bestimmte Datenquelle und eine Tabellenkonfiguration, die durch eine Klasse angegeben ist mydao = DaoManager.createDao(myConnection,My.class); Taentzer Software-Praktikum 2013 83
TableUtil Zum Erzeugen, Löschen und Managen von Tabellen Beispiele: eine neue Tabelle erzeugen, zur Tabellenkonfiguration die entsprechende Klasse angeben TableUtils.createTable(myConnectionSource,My.class) eine Tabelle löschen, zur Tabellenkonfiguration die entsprechende Klasse angeben TableUtils.dropTable(myConnectionSource,My.class,true) Taentzer Software-Praktikum 2013 84
Überblick Strukturierung von datenorientierten Android-Apps Schichtenarchitektur Möglichkeiten der Datenhaltung: in Dateien, die auf der SDCard liegen in einer internen OrmLite-Datenbank in einer Datenbank auf einem externen Server Zugriff innerhalb eines separaten Threads MySQL-Datenbank Zugriff über die Schnittstelle JDBC Taentzer Software-Praktikum 2013 85
AsyncTask Möglicherweise länger dauernde Berechnungen sollten nicht im Haupt-Thread durchgeführt werden. AsyncTask erlaubt die Benutzung von Hintergrundoperationen und gibt Ergebnisse auf dem Haupt- Thread aus. CounterScreen.java: variable Anzahl von Parametern Taentzer Software-Praktikum 2013 86
Generische Typen: AsyncTask Params der Typ der Parameter für die Berechnung Progress der Typ der Fortschrittsobjekte, die während der Berechnung dargestellt werden sollen Result der Typ des Resultars der Berechnung Überschreibbare Methoden: onpreexecute Vorbereitung der Berechnung auf dem Haupt- Thread doinbackground Durchführung im Hintergrund onprogressupdate Fortschrittsanzeige auf dem Haupt-Thread onpostexecute Aufruf nach der Berechnung auf dem Haupt- Thread Taentzer Software-Praktikum 2013 87
Design des Datenbankzugriffs Problem: Einzelne Kunden sollen ihre Daten, aber nicht die Daten anderer Kunden, lesen dürfen Lösungsmöglichkeiten: Jeder Kunde ist ein Datenbanknutzer: Der Zugriff ist rein lesend. Zu jeder Tabelle mit kritischem Inhalt wird mit SQL eine Sicht erzeugt, die nur die Daten des anfragenden Kunden enthält. (CREATE VIEW) In der DB erhält jeder Kunde die Berechtigung auf seine Sichten. Es gibt zusätzliche Services: Diese kapseln die Datenbank und geben der App nur kundenspezifische Daten zurück. Taentzer Software-Praktikum 2013 88
Zusammenfassung App mit Schichtenarchitektur Datenhaltung ist klar vom objektorientierten Datenzugriff getrennt. Intern: Datenhaltung in einer App OrmLite-Datenbank zur Speicherung von Daten in einer App OrmLite unterstützt eine einfache Benutzung von relationalen Datenbanken. DB-Schema wird durch Annotationen an Datenklassen automatisch erstellt. Extern: Datenabfrage über das Internet Anbindung einer externen Datenbank über JDBC Taentzer Software-Praktikum 2013 89
Literatur ORMLite: ormlite.com ormlite.com/javadoc/ormlite-core/doc-files/ormlite.html SQL und JDBC: siehe LV Datenbanksysteme 1 Taentzer Software-Praktikum 2013 90