Mobile App Development. - Persistenz -

Größe: px
Ab Seite anzeigen:

Download "Mobile App Development. - Persistenz -"

Transkript

1 Mobile App Development - Persistenz -

2 Inhalt Shared Preferences Dateien Datenbanken ORM 2

3 Shared Preferences

4 Shared Preferences Framework zum Speichern von Key-Value- Paaren Datentypen: boolean, float, int, long, String Daten werden in einer Datei gespeichert Nach Deinstallation der App werden Preferences-Dateien mit gelöscht 4

5 Shared Preferences // DemoActivity für SharedPreferences public class SharedPrefsDemoActivity extends Activity {"! " public static final String PREFS_FILE = "prefsfile";" " public static final String MY_KEY = "mykey";" " " " private int mmymember;" " " " protected void oncreate(bundle savedinstancestate) {" " " super.oncreate(savedinstancestate); " " // Aufrufen der SharedPreferences" " " SharedPreferences prefs = getsharedpreferences(prefs_file, MODE_PRIVATE);" " " // Abruf des Wertes für MY_KEY (default: 0)" " " mmymember = prefs.getint(my_key, 0);" " }" " " protected void onstop() {" " super.onstop();" " // Aufruf der SharedPreferences" " SharedPreferences prefs = getsharedpreferences(prefs_file, MODE_PRIVATE);" " // Editor aufrufen, um Änderungen zu machen" " Editor editprefs = prefs.edit();" " // Key-Value-Paar anlegen/aktualisieren" " editprefs.putint(my_key, mmymember);" " // Änderungen schreiben" " editprefs.commit();" " }" } 5

6 Dateien

7 Dateien Zwei mögliche Plätze zum Speichern von Dateien: Internal Storage geräteinterner Speicher External Storage externer Speicher, wie SD-Karten 7

8 Interner Speicher Standardmäßig sind Dateien, die auf dem internen Speicher abgelegt werden privat, d.h. andere Anwendungen können nicht darauf zugreifen Wird die Anwendung deinstalliert, werden auch die internen Dateien gelöscht 8

9 Interner Speicher Lesen von Dateien Context.openFileInput(...) liefert einen FileInputStream Die weitere Verarbeitung erfolgt wie bei Standard Datei- und Stream-Verarbeitung in Java 9

10 Interner Speicher Datei lesen private void readfile(string filename) throws Exception {" " /* openfileinput() öffnet die Datei mit dem angegebenen Namen" " * und liefert eine FIS zurück */" " FileInputStream fis = openfileinput(filename);" " BufferedReader reader = new BufferedReader(" new InputStreamReader(fis));" " String line = "";" " /* Auslesen der Datei */" " while ( (line = reader.readline())!= null) {" " " /* zeilenweise Verarbeitung */" " " Log.d(LOG, line);" " }" " /* reader und stream schließen */" } 10

11 Interner Speicher Dateien schreiben Context.openFileOutput(...) liefert einen FileOutputStream existiert die Datei noch nicht, wird sie automatische angelegt das Schreiben der Datei funktioniert wie auch bei Standard Java 11

12 Interner Speicher Dateien schreiben private void writefile(string filename, String content) " throws Exception {" " /* openfileoutput öffnet einen FOS, der mit der angegebenen " " Datei verbunden ist und legt die Datei an, wenn sie noch " " nicht existiert */" " FileOutputStream fos = openfileoutput(filename, MODE_PRIVATE);" " OutputStreamWriter osw = new OutputStreamWriter(fos);" " /* Inhalt in die Datei schreiben */" " osw.write(content);" " " " /* writer und stream schließen */" " osw.close();" } 12

13 Interner Speicher Android unterschiedet verschiedene Modi zum Anlegen einer Datei MODE_PRIVATE" Datei ist privat, kann also nur von der erstellenden App gelesen werden wenn Datei bereits vorhanden, wird sie überschrieben 13

14 Interner Speicher MODE_APPEND" Wenn Datei bereits vorhanden, wird neuer Inhalt angehängt MODE_WORLD_READABLE" Alle anderen Apps haben lesenden Zugriff 14

15 Interner Speicher MODE_WORLD_WRITEABLE" Alle anderen Apps haben schreibenden Zugriff auf die Datei 15

16 Interner Speicher Es gibt einige weitere nützliche Methoden, um mit Dateien und Verzeichnisse zu arbeiten" Context.getFilesDir() Absoluter Pfad zum dem Verzeichnis, in dem interne Dateien abgelegt werden Context.getDir(name, mode) Erzeugt oder öffnet ein Verzeichnis 16

17 Interner Speicher Weitere Methoden" Context.deleteFile(name) Entfernt die angegebene Datei Context.fileList() Listet alle mit der App assoziierten (internen) Dateien auf 17

18 Interner Speicher Weitere Methoden" Context.getCacheDir() Gibt den Pfad zum Verzeichnis für Cache- Dateien zurück File.createTempFile(prefix, suffix) Erzeugt eine temporäre Datei im temp- Verzeichnis 18

19 Externer Speicher Im Gegensatz zum internen Speicher gibt es bei externem Besonderheiten zu beachten: Daten können von jedermann gelesen werden Speicher muss nicht immer verfügbar sein (SD-Karte kann entfernt werden) 19

20 Externer Speicher Verfügbarkeit des ext. Speichers prüfen private boolean mextstoragereadable = false;" " private boolean mextstoragewritable = false; "..." " // Überprüft, ob der externe Speicher gelesen und geschrieben werden kann " private void checkavailability() {" " " // Status des externen Speichers abrufen" " " String state = Environment.getExternalStorageState();" " " if (Environment.MEDIA_MOUNTED.equals(state)) {" // Speicher kann gelesen und geschrieben werden" mextstoragereadable = true;" mextstoragewritable = true;" " " } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {" // Speicher kann nur gelesen werden" mextstoragereadable = true;" mextstoragewritable = false;" " " } else {" // Speicher ist z.b. entfernt oder hat kein unterstütztes Dateisystem" mextstoragereadable = false;" mextstoragewritable = false;" " " }" " } 20

21 Externer Speicher Unterscheidung zwischen App-eigenen Daten und geteilten Daten App-eigene Daten sind nur für die eigene App relevant und werden bei Deinstallation mit gelöscht Geteilte Daten können auch von anderen Apps interpretiert werden (Musik, Bilder, etc.) 21

22 Externer Speicher Zugriff auf App-eigene Daten // Methode, um auf externen Speicher zuzugreifen private void accessfiles() {" " " // Verfügbarkeit des ext. Speichers prüfen" " " checkavailability();"! " "..." " " // bis API Level 7 (Eclair)" " " File extstore = Environment.getExternalStorageDirectory();" " " File extappdir7 = new File(extStore, " "Android" + File.separator + " "data" + File.separator + getpackagename() + File.separator + "files");" " " extappdir7.mkdirs();" " " // ab API Level 8 (Froyo)" " " File extappdir8 = getexternalfilesdir(null);" " " " " //..." " " // Standard Java Dateiarbeit, wie gehabt " " //..." " } 22

23 Externer Speicher Geteilte Daten sollten in öffentlichen Verzeichnissen abgelegt werden Bsp.: /Music, /Podcasts, /Alarms, /Download, etc. 23

24 Externer Speicher auf geteilte Daten zugreifen private void accesspublicfiles() {" " " // Verfügbarkeit des ext. Speichers prüfen" " " checkavailability(); " " " "..." " " // öffentliches Verzeichnis für Musik" " " File musicdir = null;" " " // bis API Level 7" " " File extdir = Environment.getExternalStorageDirectory();" " " musicdir = new File(extDir, "Music");" " " // ab API Level 8" " " musicdir = Environment".getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);" " " // Danach, wie gewohnt" " " File musicfile = new File(musicDir, "mymusic.mp3");" " " musicfile.createnewfile();" " } 24

25 Externer Speicher Temporäre Dateien auf den externen Speicher schreiben private void cachefiles() {" " " // Verfügbarkeit des ext. Speichers prüfen" " " checkavailability();" " " //..." " " " " File cachedir = null;" " " // bis API Level 7" " " File extdir = Environment.getExternalStorageDirectory();" " " cachedir = new File(extDir, "/Android/data/" + getpackagename() + "/cache/");" " " // ab API Level 8" " " cachedir = getexternalcachedir();" " " // Erstellen der temporären Datei" " " File cachefile = File.createTempFile("myPrefix", "mysuffix", cachedir);" " } 25

26 Datenbanken

27 SQLite SQLite ist die Standard Datenbank-Engine, die in Android verwendet wird optimiert für Embedded Systems zeichnet sich aus durch Abgeschlossenheit, Serverlosigkeit Minimal- bis 0-Konfiguration unterstützt Standard SQL 27

28 SQLite Daten werden in SQLite durch sogenannte Storage Classes repräsentiert Jedem Wert wird ein Datentyp zugeordnet 28

29 Storage Classes Datentyp Beschreibung NULL INTEGER REAL TEXT BLOB Null-Wert vorzeichenbehaftete Ganzzahl (1-8 Byte) Dezimalzahl (8 Byte) String Binärdaten 29

30 Storage Classes Datentyp Konvertierung Darstellung Boolean INTEGER 0 = false, 1 = true Date/ Time TEXT REAL INTEGER ISO8601: YY-MM-DD HH:MM.SS.SSS Zeit in Tagen seit v.chr. 12:00 UNIX-Zeit, Sekunden seit :00:00 UTC 30

31 Datentypen Alle Standard SQL-Datentypen können verwendet werden Integer, Numeric, Decimal, Float, Real, Double Varchar, Char Date, Time, Timestamp Boolean Blob, Clob 31

32 Operatoren " * / %" + -" << >> & " < <= > >=" = ==!= <> IS IS NOT IN LIKE GLOB" AND " OR siehe: 32

33 DatenbankfunkConen Kernfunktionen abs, hex, min, max, random, round,... substr, trim, replace, upper, lower,... siehe: lang_corefunc.html 33

34 DatenbankfunkConen Aggregatfunktionen min, max, avg, count, sum weitere: lang_aggfunc.html Datum & Zeit date, time, datetime, strftime 34

35 SQLiteOpenHelper abstrakte Oberklasse für DB-Zugriffe empfohlene Schnittstelle zum Erstellen, Öffnen und Aktualisieren von Datenbanken 35

36 SQLiteOpenHelper Wenn von SQLiteOpenHelper abgeleitet wird, müssen folgende Methode überschrieben werden Konstruktor: Hier wird dem super Konstruktor der Context, Datenbankname und -version mitgegeben oncreate(): wird aufgerufen, wenn die Datenbank erstellt wird. Hier werden SQL Statements ausgeführt, um die Tabellen zu erstellen. 36

37 SQLiteOpenHelper onupgrade(): wird aufgerufen, wenn eine Datenbankversion gefunden wurde, die älter ist, als die aktuelle. Hier werden alte Datenbanktabellen angepasst. ondowngrade(): ist das Pendant zu der Methdode onupgrade() (ab API 11) 37

38 SQLiteOpenHelper Beispiel: Erstellung einer Datenbank, mit der TODOs gespeichert werden können Datenmodell: todo date title description Integer Text Text 38

39 DatabaseHelper // Hilfsklasse zum Erstellen, Aktualisieren und Öffnen der Datenbank public class DatabaseHelper extends SQLiteOpenHelper {"! " public static final String DATABASE_NAME = "todo.db"; " // Datenbankname" " private static final int DATABASE_VERSION = 1;"" " // Datenbankversion" " " " public static final String TABLE_NAME = "todo";" " public static final String DATE_FIELD_NAME = "date";" " public static final String DATE_FIELD_TYPE = "INTEGER";" " public static final String TITLE_FIELD_NAME = "title";" " public static final String TITLE_FIELD_TYPE = "TEXT";" " public static final String DESCR_FIELD_NAME = "description";" " public static final String DESCR_FIELD_TYPE = "TEXT";" " " " // SQL statement zum Erstellen der Tabelle" " private static final String TABLE_CREATE = " "CREATE TABLE " + TABLE_NAME + "(" " " + DATE_FIELD_NAME + " " + DATE_FIELD_TYPE + ", "" " + TITLE_FIELD_NAME + " " + TITLE_FIELD_TYPE + ", "" " + DESCR_FIELD_NAME + " " + DESCR_FIELD_TYPE + ")";" " " " // Konstruktor" " public DatabaseHelper(Context context) {" " " super(context, // der Context DATABASE_NAME, " " // Datenbankname null, " // CursorFactory DATABASE_VERSION);" // Datenbankversion" " }" " " " //..." Mobile App Development 39

40 DatabaseHelper // Hilfsklasse zum Erstellen, Aktualisieren und Öffnen der Datenbank public class DatabaseHelper extends SQLiteOpenHelper { " // Wird aufgerufen, wenn die DB das erste mal erstellt wird" " public void oncreate(sqlitedatabase db) {" " " try {" db.execsql(table_create);" " " } catch (SQLException ex) {" Log.e("DatabaseHelper", "error creating tables", ex);" " " }" " }"! " public void onupgrade(sqlitedatabase db, int oldver, int newver) {" " " // alte Tabellen auslesen und löschen, neue Tabellen anlegen" " " // alten Inhalt in neue Tabellen einfügen" " }" " " // ab API-Level 11" " public void ondowngrade(sqlitedatabase db, int oldver, int newver) {" " " // alte Tabellen auslesen und löschen, neue Tabellen anlegen" " " // alten Inhalt in neue Tabellen einfügen" " }" } 40

41 Daten abfragen Mit der Methode getreadabledatabase() wird aus dem SQLiteOpenHelper eine lesbare Datenbankinstanz erzeugt Mit der query()-methode der DB Instanz können Daten gelesen werden Die query() Methode besitzt einige Parameter, die einer SQL-Abfrage entsprechen 41

42 Daten abfragen query()-parameter table: der Tabellenname columns: String Array, das die abzufragenden Spaltennamen enthält oder null für alle Spalten selection: entspricht der WHERE-Klausel eines SQL-Statements ohne das WHERE Schlüsselwort 42

43 Daten abfragen query()-parameter selectionargs: dient der Parametrisierung der selection groupby: dient der Gruppierung von Zeilen in Verbindung mit Aggregatfunktionen having: Filter für Gruppierungen 43

44 Daten abfragen query()-parameter orderby: dient der Sortierung des Ergebnisses nach einer Spalte limit: begrenzt die Anzahl der Ergebnisse 44

45 Daten abfragen // Methode zum abfragen von Daten aus der DB" private void doselect() {" " // Datenbank zum Lesen öffnen " " SQLiteDatabase db = new DatabaseHelper(this).getReadableDatabase();" " // query(string table, String[] columns, String selection, String[] " " // selectionargs, String groupby, String having, String orderby, " // String limit)" " Cursor result = db.query(" DatabaseHelper.TABLE_NAME, null, null, null, null, null, " DatabaseHelper.DATE_FIELD_NAME, null);" " // Ergebnis verarbeiten" " // Datenbank schließen" " db.close();" } Mobile App Development 45

46 Daten abfragen Die query() Methode der Datenbank- Instanz liefert einen Cursor zurück Cursor repräsentieren das Ergebnis der Datenbankabfrage Ein Cursor besitzt einen Zeiger, mit dem man datensatzweise über das ResultSet navigieren kann 46

47 Daten abfragen Nützliche Cursor Methoden getcount(): gibt die Anzahl der Datensätze im Cursor an moveto[first, Next, Last](): bewegt den Datensatzzeiger im Cursor getposition(): gibt die aktuelle Zeigerposition im Cursor zurück 47

48 Daten abfragen Nützliche Cursor Methoden getcolumnindex(): gibt den Index zum übergebenen Spaltennamen zurück get[long,string,int,short,...](): gibt den Wert im Datensatz für den angegebenen Spaltenindex zurück 48

49 Daten abfragen // Methode zum abfragen von Daten aus der DB" private void doselect() {" " // Datenbank zum Lesen öffnen und query ausführen" " Cursor result = db.query(...);" " if (result.movetofirst()) { // wenn Cursor nicht leer" " " // Spaltenindex vom Datums- und Titel-Feld abrufen" " " int dateidx = result.getcolumnindex(databasehelper.date_field_name);" " " int titleidx = result.getcolumnindex(databasehelper.title_field_name);" " " do { " // Datum und Titel auslesen" long date = result.getlong(dateidx);" String title = result.getstring(titleidx);" //... und verarbeiten" Log.d(LOG_TAG, new Date(date) + " " + title);" " " } while (result.movetonext()); // solange Datensätze vorhanden" " }"! " // Cursor direkt wieder schließen, um Ressourcen freizugeben " " result.close();" " // Datenbank schließen" " db.close();" } Mobile App Development 49

50 Daten abfragen Zur Abfrage von Daten können auch Standard SQL Statements verwendet werden Optional können diese parametrisiert werden 50

51 Daten abfragen public void dorawselect() {" " // Datenbank zum Lesen öffnen " " SQLiteDatabase db = new DatabaseHelper(this).getReadableDatabase();" " // SQL Statement erstellen" " String sql = "SELECT * FROM " + DatabaseHelper.TABLE_NAME + " " ORDER BY " + DatabaseHelper.DATE_FIELD_NAME;" " // query ausführen" " Cursor result = db.rawquery(sql, null);" " if (result.movetofirst()) { // wenn Cursor nicht leer" " " // Spaltenindex vom Datums- und Titel-Feld abrufen" " " int dateidx = result.getcolumnindex(databasehelper.date_field_name);" " " int titleidx = result.getcolumnindex(databasehelper.title_field_name);" " " do { // für jeden Datensatz" // Datum und Titel auslesen" long date = result.getlong(dateidx);" String title = result.getstring(titleidx);" //... und verarbeiten" Log.d(LOG_TAG, new Date(date) + " " + title);" " " } while (result.movetonext()); // solange Datensätze vorhanden" " }" result.close();" // Cursor schließen" " db.close(); // Datenbank schließen" } 51

52 Daten einfügen Um Datensätze in die Datenbank einzufügen werden ContentValues Objekte verwendet Ein ContentValues Objekt repräsentiert einen Datensatz in einer Tabelle Ein CotentValues Objekt besitzt put() Methoden, die einen Schlüssel und einen Wert erhalten 52

53 Daten einfügen Schlüssel ist der Spaltenname aus der Datenbank und dazu der zu setzende Wert ContentValues Objekte werden unter Angabe der Tabelle per insert() Methode in die Datenbank eingefügt 53

54 Daten einfügen " // Methode zum Einfügen von Daten in die DB" " private void doinsert() {" " " // Datenbank zum Schreiben öffnen" " " SQLiteDatabase db = mdbhelper.getwritabledatabase();" " " // Datensatz erstellen" " " ContentValues vals = new ContentValues();" " " vals.put(databasehelper.date_field_name, System.currentTimeMillis());" " " vals.put(databasehelper.title_field_name, "meintitel");" " " vals.put(databasehelper.descr_field_name, "meinebeschreibung");" " " // Datensatz in die Datenbank einfügen" " " db.insert(databasehelper.table_name, null, vals);" " " // Datenbank schließen" " " db.close();" " } 54

55 Daten aktualisieren Die Aktualisierung von Datensätzen funktioniert ähnlich wie das Einfügen Es wird ein ContentValues Objekt mit den neuen Daten erzeugt und per update() Methode abgeschickt 55

56 Daten aktualisieren " // Mehtode zum Aktualisieren von Datensätzen" " private void doupdate() {" " " // Datenbank zum Schreiben öffnen" " " SQLiteDatabase db = mdbhelper.getwritabledatabase();" " " // ContentValues Objekt mit den neuen Daten erzeugen" " " ContentValues values = new ContentValues();" " " values.put(databasehelper.date_field_name, " new java.util.date().gettime());" " " // Datensätze unter Angabe des Tabellennamens und einer " " " // WHERE Bedingung aktualisieren"!! int rows = db.update(databasehelper.table_name, values, " " DatabaseHelper.DATE_FIELD_NAME + " LIKE 'b%'", null);" " " Log.d(LOG_TAG, "affected rows: " + rows);" " " " " // Datenbank schließen" " " db.close();" " } 56

57 Daten löschen Datensätze werden gelöscht, indem eine WHERE Bedingung angegeben wird, die auf die zu löschende Datensätze zutrifft 57

58 Daten löschen " // Methode zum Löschen von Datensätzen" " private void dodelete() {" " " // Datenbank zum Schreiben öffnen" " " SQLiteDatabase db = mdbhelper.getwritabledatabase();" " " // Datensätze unter Angabe einer WHERE Bedingung löschen" " " int rows = db.delete(databasehelper.table_name, " " DatabaseHelper.DATE_FIELD_NAME + " < date('now')", null);" " " // Anzahl gelöschter Datensätze löschen" " " Log.d(LOG_TAG, rows + " rows deleted");" " " // Datenbank schließen" " " db.close();" " } 58

59 Raw Queries Einfügen, Aktualisieren und Löschen private void dorawinsertupdatedelete() {" " // Datenbank zum Schreiben öffnen" " SQLiteDatabase db = new DatabaseHelper(this).getWritableDatabase();" " " " // insert statement erstellen & abschicken" " String insertsql = "INSERT INTO " + DatabaseHelper.TABLE_NAME + " VALUES("" " " + System.currentTimeMillis() + ", 'mein Titel', 'meinebeschreibung')";" " db.execsql(insertsql);" " // update statement erstellen & abschicken" " String updatesql = "UPDATE " + DatabaseHelper.TABLE_NAME + " SET " " " " + DatabaseHelper.TITLE_FIELD_NAME + "=neuertitel WHERE " " " " + DatabaseHelper.DATE_FIELD_NAME + "<" + System.currentTimeMillis();" " db.execsql(updatesql);" " // delete statement erstellen & abschicken" " String deletesql = "DELETE FROM " + DatabaseHelper.TABLE_NAME + " WHERE "" " " + DatabaseHelper.TITLE_FIELD_NAME + " LIKE 'n%'";" " db.execsql(deletesql);" " db.close(); // Datenbank schließen" } 59

60 TransakConen Standardmäßig wird jedes SQL-Statement in einer eigenen Transaktion ausgeführt Gründe, um einen eigenen Transaktionsrahmen zu setzen: succeed or fail as a whole Performance 60

61 TransakConen Transaktionen werden mit begintransaction() gestartet... und mit endtransaction() beendet Um die Transaktion als erfolgreich zu markieren, muss vor dem Aufruf von endtransaction() die Methode settransactionsuccessful() aufgerufen werden 61

62 TransakConen Transaktionen ausführen private void dotransaction() {" " // Datenbank zum Schreiben öffnen" " SQLiteDatabase db = new DatabaseHelper(this).getWritableDatabase();" " " " try {" " " // Transaktion starten" " " db.begintransaction();" " " /* auf der Datenbank arbeiten */" " " // Transaktion als erfolgreich markieren" " " db.settransactionsuccessful();" " } catch (Exception ex) {" " " // Fehler behandeln" " } finally {" " " // Transaktion beenden" " " db.endtransaction();" " }" } 62

63 CursorAdapter

64 CursorAdapter Die Ergebnisse von Datenbankabfragen können über einen Adapter direkt in AdapterViews (ListView, SpinnerView) dargestellt werden Hierfür werden CursorAdapter verwendet, die den AdapterViews ebenso wie ArrayAdapter ihre Daten zur Verfügung stellen 64

65 CursorAdapter Exkurs: Eigene List Layouts Einträge in einer Liste, also die Darstellung der einzelnen Einträge, können mit einem eigenen Layout versehen werden Layout-Dateien werden genauso erstellt, wie bei Activity-Layouts 65

66 CursorAdapter Exkurs: Eigene List Layouts <?xml version="1.0" encoding="utf-8"?>" <LinearLayout xmlns:android="..."" android:layout_width="match_parent"" android:layout_height="match_parent"" android:orientation="horizontal" >"! <TextView" android:layout_width="match_parent"" android:layout_height="wrap_content"" android:layout_weight="1"/>"! <TextView" android:layout_width="wrap_content"" android:layout_height="wrap_content"/>"! </LinearLayout> 66

67 CursorAdapter Exkurs: Eigene List Layouts Layout verwenden private void usecustomlistlayout() {" " // ListView Referenz abrufen" " ListView listview = " " " (ListView) findviewbyid(r.id.listview1);" " // Adapter bekommt die Layout Referenz " " // zum angepassten Layout" " ArrayAdapter<String> listadapter = " " " new ArrayAdapter<String>(" this, R.layout.list_item);" " //... wie gehabt" } 67

68 CursorAdapter CursorAdapter stellen eine Brücke zwischen AdapterViews und Cursor Objekten her Im CursorAdapter wird angegeben, welche Spalte auf welches Element im ListItem Layout abgebildet wird Das Auslesen des Cursors und Setzen der ListItems wird vom Adapter übernommen 68

69 CursorAdapter private void setlistcursoradapter() {"! " // Datenbank öffnen und Abfrage ausführen" " SQLiteDatabase db = new DbHelper(this).getReadableDatabase();" " String sql = "select _id, title, date from todo";" " Cursor cursor = db.rawquery(sql, null);" " // gibt an, welche Spalten in der ListView dargestellt werden sollen" " String[] from = new String[] {"title", "date"};" " // gibt an, welche Spalte in welcher View dargestellt werden soll" " int[] to = new int[]{r.id.title, R.id.date};"! " // CursorAdapter erstellen" " SimpleCursorAdapter sca = new SimpleCursorAdapter(this," " " R.layout.list_item, cursor, from, to, 0);" " // Adapter sezten" " ListView lv = (ListView) findviewbyid(r.id.listview1);" " lv.setadapter(sca);"" } 69

70 CursorAdapter Hinweis: Um einen SimpleCursorAdapter zu nutzen, muss die verwendete Tabelle eine Spalte _id besitzen! 70

71 Objekt- relaconales Mapping

72 ORM Problemstellung Objekt-Modell und Relationales Modell unterscheiden sich Objekte müssen immer wieder in Tabellen-Datensätze konvertiert werden und umgekehrt 72

73 ORM Problemstellung Hohe Fehleranfälligkeit durch Verwendung von Plain SQL (Typo s) große Menge an SQL Statements muss programmiert werden 73

74 ORM Beispiel zwei Tabellen mit einfacher 1:n- Verknüpfung todo todo_group date title description Integer Text Text 1 id name Integer Text fk_todo_lis t Integer n 74

75 ORM Beispiel public class TodoDbHelper extends SQLiteOpenHelper {" " " " public static final String LOG_TAG = TodoDbHelper.class.getName();"! " public static final String DATABASE_NAME = "groupedtodo.db";" " private static final int DATABASE_VERSION = 1;"! // table creation attributes" " public static final String TODO_TABLE_NAME = "todo";" " " public static final String TODO_ID_FIELD_NAME = "_id";" " public static final String TODO_ID_FIELD_TYPE = "INTEGER PRIMARY KEY AUTOINCREMENT";" " public static final String TODO_DATE_FIELD_NAME = "date";" " public static final String TODO_DATE_FIELD_TYPE = "INTEGER";" " public static final String TODO_TITLE_FIELD_NAME = "title";" " public static final String TODO_TITLE_FIELD_TYPE = "TEXT";" " public static final String TODO_PARENT_FIELD_NAME = "parent";" " public static final String TODO_PARENT_FIELD_TYPE = "INTEGER";" " public static final String TODO_PARENT_FOREIGN_KEY = CONSTRAINT fk_parent FOREIGN KEY (parent) REFERENCES todogroup(_id)";" " " " public static final String TODO_GROUP_TABLE_NAME = "todo_group";" " public static final String TODO_GROUP_ID_FIELD_NAME = "_id";" " public static final String TODO_GROUP_ID_FIELD_TYPE = "INTEGER PRIMARY KEY AUTOINCREMENT";" " public static final String TODO_GROUP_NAME_FIELD_NAME = "name";" " public static final String TODO_GROUP_NAME_FIELD_TYPE = "TEXT";" " " " //..." } 75

76 ORM Beispiel public class TodoDbHelper extends SQLiteOpenHelper {" " " " //..." " " " // SQL statement for table creation" " private static final String TODO_TABLE_CREATE = " "CREATE TABLE " + TODO_TABLE_NAME + "(" " " + TODO_ID_FIELD_NAME + " " + TODO_ID_FIELD_TYPE + ", "" " + TODO_DATE_FIELD_NAME + " " + TODO_DATE_FIELD_TYPE + ", "" " + TODO_TITLE_FIELD_NAME + " " + TODO_TITLE_FIELD_TYPE + ", " " " + TODO_PARENT_FIELD_NAME + " " + TODO_PARENT_FIELD_TYPE + ", "" " + TODO_PARENT_FOREIGN_KEY + ")";"! // SQL statement for TodoList table creation" " private static final String TODO_GROUP_TABLE_CREATE = " String.format("CREATE TABLE %s (%s %s, %s %s)", TODO_GROUP_TABLE_NAME, " " " TODO_GROUP_ID_FIELD_NAME, TODO_GROUP_ID_FIELD_TYPE," " " TODO_GROUP_NAME_FIELD_NAME, TODO_GROUP_NAME_FIELD_TYPE);" }" 76

77 ORM Lösung Objekt-relationales Mapping (ORM) ermöglicht die Abbildung von Objekten auf Tabellen Abstraktion der Datenbankzugriffe durch Methoden zum Erstellen, Löschen,... Foreign-Key Beziehungen zwischen Datensätzen werden in Objektreferenzen umgewandelt 77

78 ORM Lösung Es muss kein SQL mehr geschrieben werden (kann aber) Es gibt viele verschiede ORM Frameworks (OrmLite, greendao,...) Hier in der Vorlesung wird OrmLite exemplarisch für Android vorgestellt 78

79 ORM OrmLite ( Sehr einfaches OrmFramework schnelle Einarbeitungszeit Es muss nur eine jar-datei eingebunden werden Entities (Objekte) werden mit Annotations versehen 79

80 ORM Todo public class Todo {"! " private int id;" " private long date;" " " private String title; " " private String description;" " private TodoList parent;" " " " public Todo() {" " }"! // setter & getter" public class TodoList {"! " private int id;" " private String name;" " private Collection<Todo> todos;" " " " public TodoList() {" " }"! " // setter & getter" }"!!! 80

81 ORM OrmDbHelper public class OrmDbHelper extends OrmLiteSqliteOpenHelper {"! " public static final String LOG = OrmDbHelper.class.getName();" " public static final String DB_NAME = "todo.db";" " public static final int DB_VERSION = 1;" " " " public OrmDbHelper(Context context) {" " " super(context, DB_NAME, null, DB_VERSION);" " }" " " " public void oncreate(sqlitedatabase db, ConnectionSource source) {" // Registrierung der Klassen beim ORM Framework" " " try {" TableUtils.createTable(source, Todo.class);" TableUtils.createTable(source, TodoList.class);" " " } catch (SQLException ex) {" Log.e(LOG, "error creating tables", ex);" " " }" " }" } 81

82 ORM Data Access Objects Der Zugriff auf die Entitäten, da heißt Suchen, Einfügen, Aktualisieren und Löschen, wird über sog. DAOs realisiert Die DAOs kapseln die eigentlichen Datenbankzugriffe (SELECT, INSERT,...) Für jede Entität wird ein eigenes DAO erstellt 82

83 ORM Data Access Object erstellen public class OrmDbHelper extends OrmLiteSqliteOpenHelper {"!! //... oncreate()..." // Erzeugung des Data Access Objects" " public Dao<Todo, Integer> createtododao() {" " " try {" return DaoManager.createDao(connectionSource, Todo.class);" " " } catch (SQLException ex) {" Log.e(LOG, "error creating DAO for Todo class", ex);" " " }" " " return null;" " }"! } 83

84 ORM Daten suchen und manipulieren!!!!! private void handletodos() throws SQLException {" }" // Data Access Object für Todo erstellen " final Dao<Todo, Integer> tododao = dbhelper.createtododao();" // query all todos from db" final List<Todo> alltodos = tododao.queryforall();" // create new todo" Todo todo = new Todo(new Date(), "Test title", "Test description");" tododao.create(todo);" // delete todo element with id=5" tododao.deletebyid(5);" // update todo element" tododao.update(todo);" 84

85 Literatur I. Mark L. Murphy: The Busy Coder s Guide To Android Development, Version 4.3, 2012 II. Thomas Künneth: Android 3 - Apps entwickeln mit dem Android SDK Galileo Press, 2011 III. data/data-storage.html 85

Mobile App Development - Persistenz -

Mobile App Development - Persistenz - Mobile App Development - Persistenz - Inhalt Shared Preferences Dateien Datenbanken ORM Shared Preferences Shared Preferences Framework zum Speichern von Key-Value- Paaren Datentypen: boolean, float, int,

Mehr

Datenmanagement in Android-Apps. 16. Mai 2013

Datenmanagement in Android-Apps. 16. Mai 2013 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

Mehr

Android Java Specifics / Basic IO

Android Java Specifics / Basic IO Dalvik virtual machine Registermaschine anstelle einer Stackmaschine Optimiert für geringen Speicherverbrauch Umwandlung von.class Dateien in.dex-format mit Hilfe von dx Jedes Programm läuft als eigener

Mehr

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler Programmieren für mobile Endgeräte SS 2013/2014 Programmieren für mobile Endgeräte 2 Informationen aus der Datenbank lesen Klasse SQLiteDatabase enthält die Methode query(..) 1. Parameter: Tabellenname

Mehr

Android Programmierung. Studiengang MI

Android Programmierung. Studiengang MI Android Programmierung mit Java Studiengang MI Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm Hochschule Harz FB Automatisierung und Informatik mwilhelm@hs-harz.de http://mwilhelm.hs-harz.de Raum 2.202 Tel.

Mehr

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar Qt-Seminar Dienstag, 10.2.2009 SQL ist......die Abkürzung für Structured Query Language (früher sequel für Structured English Query Language )...ein ISO und ANSI Standard (aktuell SQL:2008)...eine Befehls-

Mehr

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler Programmieren für mobile Endgeräte SS 2013/2014 Programmieren für mobile Endgeräte 2 SQLite als Datenbank-Managementsystem (DBMS) wenige 100 KB schlanke Programmbibliothek Aktuelle Version: 3.8.1 Für die

Mehr

Oracle: Abstrakte Datentypen:

Oracle: Abstrakte Datentypen: Oracle: Abstrakte Datentypen: Oracle bietet zwei mögliche Arten um abstrakte Datentypen zu implementieren: Varying Array Nested Table Varying Array (kunde) kdnr kdname gekaufteart 1 Mustermann 1 4 5 8

Mehr

3. Persistenz und Datenbanken Content Providers. Content Providers. Generische Schnittstelle zum Zugriff auf Daten zwischen Anwendungen

3. Persistenz und Datenbanken Content Providers. Content Providers. Generische Schnittstelle zum Zugriff auf Daten zwischen Anwendungen Content Providers Generische Schnittstelle zum Zugriff auf Daten zwischen Anwendungen Entkopplung der Daten-Schicht von der Anwendungsschicht Zugriff erfolgt URI-basiert Kontrolle der Zugriffsrechte eingebaute

Mehr

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt 14.4.2016 Technische Hochschule Georg Agricola WORKSHOP TEIL 3 IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Morse-Tabelle...

Mehr

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. Einfache Ein- und Ausgabe mit Java 1. Hallo-Welt! Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. /** Die Klasse hello sendet einen

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Einführung in Javadoc

Einführung in Javadoc Einführung in Javadoc Johannes Rinn http://java.sun.com/j2se/javadoc Was ist Javadoc? Javadoc ist ein Werkzeug, dass eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil:

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann. JDBC in 5 Schritten JDBC (Java Database Connectivity) ist eine Sammlung von Klassen und Schnittstellen, mit deren Hilfe man Verbindungen zwischen Javaprogrammen und Datenbanken herstellen kann. 1 Einrichten

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum: 11.09.2009

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum: 11.09.2009 Hochschule Darmstadt DATENBANKEN Fachbereich Informatik Praktikum 3 Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum: 11.09.2009 PL/SQL Programmierung Anwendung des Cursor Konzepts und Stored Procedures Und Trigger

Mehr

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2 5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 7 7. Datenbank-Zugriff Zum Beispiel aus PHP-Skripten: Client 7-2 Struktur einer Datenbank 7-3 Erzeugen von Datenbanken

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken. In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access Die Grundlagen der Datenbanken kurspc15 Inhaltsverzeichnis Access... Fehler! Textmarke nicht

Mehr

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015 Software Engineering Zur Architektur der Applikation Data Repository Franz-Josef Elmer, Universität Basel, HS 2015 Software Engineering: Mit acht bewährten Praktiken zu gutem Code 2 Schichtarchitektur

Mehr

DataTables LDAP Service usage Guide

DataTables LDAP Service usage Guide DataTables LDAP Service usage Guide DTLDAP Usage Guide thomasktn@me.com / www.ktn.ch Benutzung des DTLDAP Service DataTables Der Service stellt einen JSON Feed für DataTables (http://www.datatables.net)

Mehr

Informatik 12 Datenbanken SQL-Einführung

Informatik 12 Datenbanken SQL-Einführung Informatik 12 Datenbanken SQL-Einführung Gierhardt Vorbemerkungen Bisher haben wir Datenbanken nur über einzelne Tabellen kennen gelernt. Stehen mehrere Tabellen in gewissen Beziehungen zur Beschreibung

Mehr

Große Übung Praktische Informatik 1

Große Übung Praktische Informatik 1 Große Übung Praktische Informatik 1 2005-12-08 fuessler@informatik.uni-mannheim.de http://www.informatik.uni-mannheim.de/pi4/people/fuessler 1: Announcements / Orga Weihnachtsklausur zählt als Übungsblatt,

Mehr

ecaros2 - Accountmanager

ecaros2 - Accountmanager ecaros2 - Accountmanager procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Aufruf des ecaros2-accountmanager...3 2 Bedienung Accountmanager...4 procar informatik AG 2 Stand: FS 09/2012 1 Aufruf

Mehr

Datenbanken für Online Untersuchungen

Datenbanken für Online Untersuchungen Datenbanken für Online Untersuchungen Im vorliegenden Text wird die Verwendung einer MySQL Datenbank für Online Untersuchungen beschrieben. Es wird davon ausgegangen, dass die Untersuchung aus mehreren

Mehr

Programmieren I. Kapitel 15. Ein und Ausgabe

Programmieren I. Kapitel 15. Ein und Ausgabe Programmieren I Kapitel 15. Ein und Ausgabe Kapitel 15: Ein und Ausgabe Ziel: einen kleinen Einblick in die vielfältigen IO Klassen geben Grober Überblick Klasse File zur Verwaltung von Dateien Random

Mehr

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung Annabelle Klarl Zentralübung zur Vorlesung Einführung in die Informatik: http://www.pst.ifi.lmu.de/lehre/wise-13-14/infoeinf WS13/14 Action required now 1. Smartphone: installiere die App "socrative student"

Mehr

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023 Kapitel 33 Der xml-datentyp In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023 995 996 Kapitel 33: Der xml-datentyp Eine der wichtigsten

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov. 2006 M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov. 2006 M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5 Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov. 2006 M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5 Aufgabe 1: Projektion Datenbanksysteme I π A1,...,A n (π B1,...,B

Mehr

CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1

CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1 CMS.R. Bedienungsanleitung Modul Cron Revision 1 Copyright 10.09.2009 www.sruttloff.de CMS.R. - 1 - WOZU CRON...3 VERWENDUNG...3 EINSTELLUNGEN...5 TASK ERSTELLEN / BEARBEITEN...6 RECHTE...7 EREIGNISSE...7

Mehr

Graphic Coding. Klausur. 9. Februar 2007. Kurs A

Graphic Coding. Klausur. 9. Februar 2007. Kurs A Graphic Coding Klausur 9. Februar 2007 Kurs A Name: Matrikelnummer: Hinweise - Es sind keine Hilfsmaterialien erlaubt. (Keine Bücher, Taschenrechner, Handys) - Sie haben zwei Stunden Zeit. - Insgesamt

Mehr

Studentische Lösung zum Übungsblatt Nr. 7

Studentische Lösung zum Übungsblatt Nr. 7 Studentische Lösung zum Übungsblatt Nr. 7 Aufgabe 1) Dynamische Warteschlange public class UltimateOrderQueue private Order[] inhalt; private int hinten; // zeigt auf erstes freies Element private int

Mehr

Elexis-BlueEvidence-Connector

Elexis-BlueEvidence-Connector Elexis-BlueEvidence-Connector Gerry Weirich 26. Oktober 2012 1 Einführung Dieses Plugin dient dazu, den Status Hausarztpatient zwischen der BlueEvidence- Anwendung und Elexis abzugleichen. Das Plugin markiert

Mehr

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo. Mengenvergleiche: Mehr Möglichkeiten als der in-operator bietet der θany und der θall-operator, also der Vergleich mit irgendeinem oder jedem Tupel der Unteranfrage. Alle Konten außer das, mit dem größten

Mehr

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung Grundlagen der Programmierung Prof. H. Mössenböck 14. Schrittweise Verfeinerung Entwurfsmethode für Algorithmen Wie kommt man von der Aufgabenstellung zum Programm? Beispiel geg.: Text aus Wörtern ges.:

Mehr

WPF Steuerelemente Listbox, ComboBox, ListView,

WPF Steuerelemente Listbox, ComboBox, ListView, WPF Steuerelemente Listbox, ComboBox, ListView, Dr. Beatrice Amrhein Überblick Einführung Listen ComboBox Tabellen 2 Einführung 3 Listen- und Tabellen-Elemente Listen und Tabellen-Elemente sind Steuerelemente,

Mehr

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007 6. Übung zur Vorlesung Datenbanken im Sommersemester 2007 mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007 Aufgabe 1: Rekursion Betrachten Sie die folgende Tabelle

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

PHP + MySQL. Die MySQL-Datenbank. Hochschule Karlsruhe Technik & Wirtschaft Internet-Technologien T3B250 SS2014 Prof. Dipl.-Ing.

PHP + MySQL. Die MySQL-Datenbank. Hochschule Karlsruhe Technik & Wirtschaft Internet-Technologien T3B250 SS2014 Prof. Dipl.-Ing. PHP + MySQL Die MySQL-Datenbank Zusammenspiel Apache, PHP, PHPMyAdmin und MySQL PHPMyAdmin Verwaltungstool Nutzer Datei.php oder Datei.pl Apache HTTP-Server PHP Scriptsprache Perl Scriptsprache MySQL Datenbank

Mehr

Import und Export von Übergängern

Import und Export von Übergängern Import und Export von Übergängern SibankPLUS bietet Ihnen eine komfortable Schnittstelle, um den Wechsel der Schüler nach der Stufe 4 von der Grundschule auf eine weiterführende Schule zu verarbeiten.

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und 2005. combit GmbH Untere Laube 30 78462 Konstanz

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und 2005. combit GmbH Untere Laube 30 78462 Konstanz combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager Datensatzhistorie mit dem SQL Server 2000 und 2005 Datensatzhistorie mit dem SQL Server 2000 und 2005-2 - Inhalt

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

10.6 Programmier-Exits für Workitems

10.6 Programmier-Exits für Workitems 10.6 Programmier-Exits für Workitems 279 10.6 Programmier-Exits für Workitems 10.6.1 Das Interface IF_SWF_IFS_WORKITEM_EXIT Am Schritt einer Workflow-Definition im Reiter»Programmier-Exits«können verschiedene

Mehr

Access 2010. Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli 2012. inkl. zusätzlichem Übungsanhang ACC2010-UA

Access 2010. Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli 2012. inkl. zusätzlichem Übungsanhang ACC2010-UA Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli 2012 Access 2010 Grundlagen für Anwender inkl. zusätzlichem Übungsanhang ACC2010-UA 3 Access 2010 - Grundlagen für Anwender 3 Daten in Formularen bearbeiten

Mehr

Aufgaben zu XPath und XQuery

Aufgaben zu XPath und XQuery Aufgaben zu XPath und XQuery Dr. Arno Schmidhauser Letzte Revision: März 2005 Email: arno.schmidhauser@sws.bfh.ch Webseite: http://www.sws.bfh.ch/db Inhalt 1 XPath... 2 2 XQuery... 2 3 XPath/SQL Umsetzung...

Mehr

Beispiel 1: Filmdatenbank

Beispiel 1: Filmdatenbank Beispiel 1: Filmdatenbank Die Filmdatenbank hat drei Tabellen (ACTOR, MOVIE, PLAYED) Aufgabe 1: Erstelle mit Hilfe der SQL-DDL die drei Tabellen und die Datenbank (MOVIEDB) ACTOR (ActorID, Name, Birthday,

Mehr

SQL - Übungen Bearbeitung der Datenbank Personal (1)

SQL - Übungen Bearbeitung der Datenbank Personal (1) Bearbeitung der Datenbank Personal (1) 1. Abfragen einer einzigen Tabelle 1.1. Zeigen Sie alle Informationen an, die über die Kinder der Mitarbeiter gespeichert sind. 1.2. Zeigen Sie aus der Tabelle stelle

Mehr

Relationales Modell: SQL-DDL. SQL als Definitionssprache. 7. Datenbankdefinitionssprachen. Anforderungen an eine relationale DDL

Relationales Modell: SQL-DDL. SQL als Definitionssprache. 7. Datenbankdefinitionssprachen. Anforderungen an eine relationale DDL Relationales Modell: SQLDDL SQL als Definitionssprache SQLDDL umfaßt alle Klauseln von SQL, die mit Definition von Typen Wertebereichen Relationenschemata Integritätsbedingungen zu tun haben Externe Ebene

Mehr

desk.modul : WaWi- Export

desk.modul : WaWi- Export desk.modul : WaWi- Export Die Schnittstelle besteht aus einem Programm, welches die Daten aus der OfficeLine ausliest und in eine XML-Datei exportiert. Die Schnittstelle ist als ein eigenständiges Programm

Mehr

Thermoguard. Thermoguard CIM Custom Integration Module Version 2.70

Thermoguard. Thermoguard CIM Custom Integration Module Version 2.70 Thermoguard Thermoguard CIM Custom Integration Module Version 2.70 Inhalt - Einleitung... 3 - Voraussetzungen... 3 - Aktivierung und Funktion der Schnittstelle... 3 - Parameter... 4 - NLS-Einfluss... 4

Mehr

Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x),

Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x), Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 25. August 2014 Programmier-Labor 04. + 05. Übungsblatt Aufgabe 21: a) Schreiben Sie eine Methode

Mehr

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH MORE Profile Pass- und Lizenzverwaltungssystem erstellt von: Thorsten Schumann erreichbar unter: thorsten.schumann@more-projects.de Stand: MORE Projects GmbH Einführung Die in More Profile integrierte

Mehr

Anleitung. Lesezugriff auf die App CHARLY Termine unter Android Stand: 18.10.2013

Anleitung. Lesezugriff auf die App CHARLY Termine unter Android Stand: 18.10.2013 Anleitung Lesezugriff auf die App CHARLY Termine unter Android Stand: 18.10.2013 CHARLY Termine unter Android - Seite 2 Inhalt Inhalt Einleitung & Voraussetzungen 3 1. Installation und Konfiguration 4

Mehr

Abfragen: Grundbausteine

Abfragen: Grundbausteine Abfragen: Grundbausteine Abfragen sollen gezielt Teile der Information wiedergeben. Das Ergebnis einer solchen Operation ist eine. Der Aufbau der Ergebnistabelle wird durch zwei Grundverfahren festgelegt:

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Veröffentlichen von Apps, Arbeitsblättern und Storys. Qlik Sense 2.0.6 Copyright 1993-2015 QlikTech International AB. Alle Rechte vorbehalten.

Veröffentlichen von Apps, Arbeitsblättern und Storys. Qlik Sense 2.0.6 Copyright 1993-2015 QlikTech International AB. Alle Rechte vorbehalten. Veröffentlichen von Apps, Arbeitsblättern und Storys Qlik Sense 2.0.6 Copyright 1993-2015 QlikTech International AB. Alle Rechte vorbehalten. Copyright 1993-2015 QlikTech International AB. Alle Rechte

Mehr

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER INHALTSVERZEICHNIS 1. Datenbanken 2. SQL 1.1 Sinn und Zweck 1.2 Definition 1.3 Modelle 1.4 Relationales Datenbankmodell 2.1 Definition 2.2 Befehle 3.

Mehr

Prozessarchitektur einer Oracle-Instanz

Prozessarchitektur einer Oracle-Instanz 6. Juni 2008 Inhaltsverzeichnis Oracle Instanz 1 Oracle Instanz 2 3 Redo Log Buffer Shared Pool Java Pool & Large Pool Oracle Instanz Eine Oracle-Instanz ist Hauptbestandteil des Oracle Datenbank Management

Mehr

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

Mehr

Modul 122 VBA Scribt.docx

Modul 122 VBA Scribt.docx Modul 122 VBA-Scribt 1/5 1 Entwicklungsumgebung - ALT + F11 VBA-Entwicklungsumgebung öffnen 2 Prozeduren (Sub-Prozeduren) Eine Prozedur besteht aus folgenden Bestandteilen: [Private Public] Sub subname([byval

Mehr

Übungen zur Android Entwicklung

Übungen zur Android Entwicklung Übungen zur Android Entwicklung Aufgabe 1 Hello World Entwickeln Sie eine Hello World Android Applikation und laden diese auf den Emulator. Leiten Sie hierfür die Klasse android.app.activity ab und entwerfen

Mehr

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio 16.04.2015 1/9

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio 16.04.2015 1/9 BTree.dll Realisiert mit Microsoft Visual Studio 16.04.2015 1/9 INHALT 1. Allgemein... 3 2. Class BTree1 (balanciert)... 3 3. Class BTree2 (balanciert und verkettet)... 4 4. Beschreibung BTree1 und BTree2...

Mehr

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40 CAP-News 40 CAP-News ist in unrägelmäßigen Abständen erscheinende Information zum Produktkonfigurator CAP/VARIANTS. Hier werden die neuen Befehle, Funktionen und Möglichkeiten beschrieben. In CAP-News

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Zugriff auf Firebird-Datenbanken mit PHP. Daniel de West DB-Campus-Treffen 15. Januar 2004

Zugriff auf Firebird-Datenbanken mit PHP. Daniel de West DB-Campus-Treffen 15. Januar 2004 Zugriff auf Firebird-Datenbanken mit PHP Daniel de West DB-Campus-Treffen 15. Januar 2004 Inhalt PHP und Firebird Die wichtigsten Befehle Verbindungsaufbau Übermitteln von Abfragen Beenden von Verbindungen

Mehr

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql JDBC inoffizielle Abkürzung für: Java Database Connectivity seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql ist eine Menge von Klassen und Methoden, um aus Java-Programmen relationale Datenbanken

Mehr

1. Zusammenfassung der letzten Vorlesung

1. Zusammenfassung der letzten Vorlesung Websiteentwicklung auf Basis vontypo3 TypoScript Unterlagen zur Vorlesung WS 15/16-6- 1. Zusammenfassung der letzten Vorlesung 2. Marker befüllen 3. Bildbearbeitung mit TypoScript 1 Root Seite anlegen

Mehr

Prodanet ProductManager WinEdition

Prodanet ProductManager WinEdition UPDATE Beschreibung Prodanet ProductManager WinEdition Prodanet GmbH Hauptstrasse 39-41 D-63486 Bruchköbel Tel: +49 (0) 6181 / 9793-0 Fax: +49 (0) 6181 / 9793-33 email: info@prodanet.com Wichtiger Hinweis

Mehr

Der neue persönliche Bereich/die CommSy-Leiste

Der neue persönliche Bereich/die CommSy-Leiste Der neue persönliche Bereich/die CommSy-Leiste Mit der neue CommSy-Version wurde auch der persönliche Bereich umstrukturiert. Sie finden all Ihre persönlichen Dokumente jetzt in Ihrer CommSy-Leiste. Ein

Mehr

Technische Dokumentation SilentStatistikTool

Technische Dokumentation SilentStatistikTool Technische Dokumentation SilentStatistikTool Version 1.0 Marko Schröder 1115063 Inhalt Einleitung... 3 Klasse Program... 3 Klasse ArgumentHandler... 3 Bereitgestellte Variablen... 3 Bereitgestellte Methoden...

Mehr

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:

Mehr

DB2 Codepage Umstellung

DB2 Codepage Umstellung DB2 Codepage Umstellung Was bei einer Umstellung auf Unicode zu beachten ist Torsten Röber, SW Support Specialist DB2 April 2015 Agenda Warum Unicode? Unicode Implementierung in DB2/LUW Umstellung einer

Mehr

Internet online Update (Mozilla Firefox)

Internet online Update (Mozilla Firefox) Um Ihr Consoir Beta immer schnell und umkompliziert auf den aktuellsten Stand zu bringen, bieten wir allen Kunden ein Internet Update an. Öffnen Sie Ihren Mozilla Firefox und gehen auf unsere Internetseite:

Mehr

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software SQL Tutorial SQL - Tutorial SS 06 Hubert Baumgartner INSO - Industrial Software Institut für Rechnergestützte Automation Fakultät für Informatik Technische Universität Wien Inhalt des Tutorials 1 2 3 4

Mehr

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Die Entscheidung Advoware über VPN direkt auf dem lokalen PC / Netzwerk mit Zugriff auf die Datenbank des zentralen Servers am anderen

Mehr

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Bereich METIS (Texte im Internet) Zählmarkenrecherche Bereich METIS (Texte im Internet) Zählmarkenrecherche Über die Zählmarkenrecherche kann man nach der Eingabe des Privaten Identifikationscodes einer bestimmten Zählmarke, 1. Informationen zu dieser Zählmarke

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung: Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Der Sourcecode wird an den entsprechenden Stellen im Programm wiederholt Programm wird lang

Mehr

Password Depot für ios

Password Depot für ios Password Depot für ios Inhaltsverzeichnis Erste Schritte... 1 Kennwörterdatei erstellen... 1 Neue Einträge erstellen... 3 Einträge / Gruppen hinzufügen... 3 Einträge / Gruppen kopieren oder verschieben...

Mehr

Anzeige von eingescannten Rechnungen

Anzeige von eingescannten Rechnungen Anzeige von eingescannten Rechnungen Wenn Sie sich zu einer Eingangsrechnung die eingescannte Originalrechnung ansehen möchten, wählen Sie als ersten Schritt aus Ihrem Benutzermenü unter dem Kapitel Eingangsrechnung

Mehr

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY.

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY. SELECT - Der Grundbefehl zur Auswahl von Daten Die SELECT-Anweisung fragt Daten aus einer Datenbank ab und stellt diese in einer virtuellen Tabelle zur Verfügung. Diese virtuelle Tabelle, eine Menge von

Mehr

Antolin-Titel jetzt automatisch in WinBIAP kennzeichnen

Antolin-Titel jetzt automatisch in WinBIAP kennzeichnen & Antolin-Titel jetzt automatisch in WinBIAP kennzeichnen Immer mehr Schulen setzen das erfolgreiche Leseförderungsprojekt "Antolin" ein - und die Bibliotheken verzeichnen große Nachfrage nach den Kinderbüchern,

Mehr

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin PhpMyAdmin = grafsches Tool zur Verwaltung von MySQL-Datenbanken Datenbanken erzeugen und löschen Tabellen und Spalten einfügen,

Mehr

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen Übungen if / else / else if... 2... 2 Aufgabe 2:... 2 Aufgabe 3:... 2 Aufgabe 4:... 2 Aufgabe 5:... 2 Aufgabe 6:... 2 Aufgabe 7:... 3 Aufgabe 8:... 3 Aufgabe 9:... 3 Aufgabe 10:... 3 switch... 4... 4 Aufgabe

Mehr

MS Access 2010 Kompakt

MS Access 2010 Kompakt 2 ABFRAGEN Eine Abfrage ist im Wesentlichen der Filterung eines Datenbestandes sehr ähnlich. Auch hier werden aus einer Menge von Informationen nur jene Datensätze ausgewählt, die einem vorher definierten

Mehr

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7 Java 7 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Dezember 2011 JAV7 5 Java 7 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

Guideline. Facebook Posting. mit advertzoom Version 2.3

Guideline. Facebook Posting. mit advertzoom Version 2.3 Guideline Facebook Posting mit advertzoom Version 2.3 advertzoom GmbH advertzoom GmbH Stand November 2012 Seite [1] Inhalt 1 Facebook Posting Schnittstelle... 3 1.1 Funktionsüberblick... 3 2 Externe Ressource

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Zusatzaufgaben Lösungsvorschlag Objektorientierte Programmierung Lösung 22 (Java und UML-Klassendiagramm)

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Die Statistiken von SiMedia

Die Statistiken von SiMedia Die Statistiken von SiMedia Unsere Statistiken sind unter folgender Adresse erreichbar: http://stats.simedia.info Kategorie Titel Einfach Erweitert Übersicht Datum und Zeit Inhalt Besucher-Demographie

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

teamsync Kurzanleitung

teamsync Kurzanleitung 1 teamsync Kurzanleitung Version 4.0-19. November 2012 2 1 Einleitung Mit teamsync können Sie die Produkte teamspace und projectfacts mit Microsoft Outlook synchronisieren.laden Sie sich teamsync hier

Mehr