Weitere ähnliche Inhalte
Ähnlich wie Apple iOS - Daten (20)
Apple iOS - Daten
- 2. Inhalt
2© FH AACHEN | Sebastian Meßingfeld
• Dateien
• Dateisystem
• Zugriff auf Dateien
• Objektserialisierung
• iCloud
• Datenbanken
• SQLite
• Core Data Framework
• Aufgaben
- 4. Dateien
Dateisystem
• alles ist eine Datei
• auch die Datenbank (keine Client/Server Struktur)
• Dateisystem einer Anwendung:
• *.app: die eigentliche Anwendung (readonly)
• Documents: für Nutzerdaten
• Library: für sonstige Anwendungsdaten
• tmp: temporäre Dateien
4© FH AACHEN | Sebastian Meßingfeld
- 5. Dateien
Textdateien
• Lesen und Schreiben von/aus Dateien im App-
Dateisystem möglich
• Byte-Stream Ein-/Ausgabe
• Zeichenbasierte Ein-/Ausgabe
• Verarbeitung von Dateiinhalten über String-
Operationen
• keine „native“ Unterstützung für strukturierte
„Plain-Text“-Dateiinhalte
• CSV
5© FH AACHEN | Sebastian Meßingfeld
- 6. Dateien
Textdateien - Beispiele
NSString *path = [[NSBundle mainBundle] ! ! ! !
! pathForResource:@"kategorien"ofType:@"txt"];"
"
"
--"
"
// Inhalt in einem Byte-Puffer"
NSData *databuffer = [NSData dataWithContentsOfFile: path];"
"
"
--"
"
// Zeichenbasierte Verarbeitung"
NSString *content = [NSString stringWithContentsOfFile:path !
! ! !encoding:NSUTF8StringEncoding error:nil];"
"
// Array mit Zeilen aus Datei"
NSArray *lines = [content componentsSeparatedByCharactersInSet: !
! ! [NSCharacterSet newlineCharacterSet]];
6© FH AACHEN | Sebastian Meßingfeld
- 7. Dateien
XML-Dateien
• SAX- und DOM-Parsing Unterstützung vorhanden
• Simple API for XML (SAX)
• ereignisgesteuert
• Callback-Funktionen für Ereignisse (z.B. Startelement)
• Document Object Model (DOM)
• direkter Zugriff auf Elemente
• mittels libxml2
• C-basierte Implementierung
• beide Lösungen weniger alltagstauglich
• besser Dritt-Bibliothek: z.B. TouchXML
7© FH AACHEN | Sebastian Meßingfeld
- 8. Dateien
Property Lists (*.plist)
• XML-Struktur
• definierte XML-Tags für Standard-Datentypen
• <string>
• <array>
• Lesen und Schreiben von Datenstrukturen
• Arrays
• Dictionary
• „nur“ für Standard-Datentypen
• NSUserDefaults: Key/Value - Speicher mit
gleichzeitiger Synchronisation in Property List!
8© FH AACHEN | Sebastian Meßingfeld
- 9. Dateien
Property Lists (*.plist) - Beispiel
Beispiel:
// Pfad zur Datei"
NSString* path = [[NSBundle mainBundle]
pathForResource:@"kategorien"
ofType:@"plist"];"
"
// plist in Array laden"
NSArray* kategorien = [NSArray
!arrayWithContentsOfFile:path];"
"
// Ausgabe "
for (NSString* kategorie in kategorien) {"
NSLog(@"%@", kategorie);"
}
9© FH AACHEN | Sebastian Meßingfeld
- 10. Dateien
Objektserialisierung
• Unterstützung in Cocoa Touch
• akt. Objektzustand kann gespeichert werden
• mit „Unter“-Objekten (Komposition)
• Object-Graph (gleich mehr)
• Serialisierung in P-List oder Binär-String
• Implementierung von encode / decode Methode
notwendig, die Eigenschaften sichert /
wiederherstellt
10© FH AACHEN | Sebastian Meßingfeld
- 11. Dateien
Objektserialisierung - Beispiel
// Instanzmethode: Objekt serialisieren"
- (void)encodeWithCoder:(NSCoder *)aCoder"
{"
[aCoder encodeObject:self.beschreibung forKey:@“Beschreibung"];"
[aCoder encodeObject:self.preis forKey:@“preis"];"
}"
"
// Instanzmethode (Kontruktur): Objekt deserialisieren"
- (id)initWithCoder:(NSCoder *)aDecoder"
{"
self = [super init];"
if (nil != self) {"
self.beschreibung = [aDecoder decodeObjectForKey:@”beschreibung"];"
self.preis = [aDecoder decodeObjectForKey:@”preis"];"
}"
return self;"
}"
"
// Objekt serialisieren
[NSKeyedArchiver archivedDataWithRootObject:objekt];"
"
// Objekt deserialisieren"
[NSKeyedUnarchiver unarchiveObjectWithData:userData];"
"
11© FH AACHEN | Sebastian Meßingfeld
- 12. Dateien
Andere Dateiformate
• häufig verwendete Formate: CSV, JSON
• keine Parser direkt in Cocoa Touch vorhanden
• Verwendung von Dritt-Bibliotheken
• CSV: https://github.com/davedelong/CHCSVParser
• JSON: https://github.com/johnezang/JSONKit
12© FH AACHEN | Sebastian Meßingfeld
- 13. Dateien
iCloud
• (automatische) Speicherung von Daten auf
externen Servern
• Daten
• Dokumente / Dateien
• Key / Value – Speicher (ähnlich NSUserDefaults)
• Synchronisation
• zwischen gleichen Anwendungen auf unterschiedlichen
Geräten
• zwischen unterschiedlichen Anwendungen, auch
Desktop-Anwendungen
13© FH AACHEN | Sebastian Meßingfeld
- 15. Datenbanken
SQLite
• Built-In Unterstützung vorhanden
• über C-Schnittstelle ansprechbar (libsqlite3)
• eigene, extern erstellte SQLite-Datenbank kann
mit ausgeliefert werden
• kein ORM dafür in Cocoa Touch vorhanden
• CRUD-Operationen müssen über SQL-Statements
selbst erstellt werden
15© FH AACHEN | Sebastian Meßingfeld
- 16. Datenbanken
SQLite - Beispiel
NSString* path = [[NSBundle mainBundle] pathForResource:@“Data" ofType:@"sqlite"];"
"
sqlite3 *database;"
sqlite3_stmt *statement;"
"
NSString *sql = @"SELECT name FROM Artikel ORDER BY name ASC";"
"
int result = sqlite3_open([path UTF8String], &database);"
"
if(SQLITE_OK == result)"
{"
NSLog(@"Could open database");"
}"
"
if (sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { "
"
while (sqlite3_step(statement) == SQLITE_ROW) {"
NSString *message = [NSString stringWithUTF8String:(char *) ! !
! ! ! ! !sqlite3_column_text(statement, 0)];"
"
// Mach' was"
}"
"
sqlite3_finalize(statement);"
}
16© FH AACHEN | Sebastian Meßingfeld
- 17. Core Data
17© FH AACHEN | Sebastian Meßingfeld
„ ... Core Data is a schema-driven
object graph management and
persistence framework.“
Apple
- 18. Datenbanken
Core Data
• ORM Framework von Apple
• und ein bisschen mehr ...
• von MacOS X zu iOS (ab 3.0) migriert
• wie andere APIs bisher auch
• keine Neu-Entwicklung für iOS
• Erfahrung in iOS-Programmierung nötig
• kein Einsteiger-Thema
18© FH AACHEN | Sebastian Meßingfeld
- 19. Datenbanken
Core Data - Was kann Core Data?
• Aufbau einer datengetriebenen Anwendung:
• Core Data bietet für einzelne Funktionalitäten
Schnittstellen / Implementierung an
• Struktur ist vorgegeben
• Anpassungen der einzelnen Punkte möglich
19© FH AACHEN | Sebastian Meßingfeld
Speichern
Rückgängig
Wiederholen
Validierung
Lazy
Loading
Suche
Daten-
speicher
Anwendung
View 1 View 2
Speichern
Rückgängig
Wiederholen
Validierung
Lazy
Loading
Suche
Daten-
speicher
Anwendung
View 1 View 2
Core DataEntwickler
- 20. Datenbanken
Core Data - Aufbau
• Verwaltung als Objekt-Graph
• Objekte sind mit einem Kontext (Blackbox)
verbunden
• Kontext ist für das Life-Cycle Management der
zugehörigen Objekte verantwortlich
• Beziehungen der Objekte zueinander
• Persistierung
20© FH AACHEN | Sebastian Meßingfeld
Kategorie
Artikel
Artikel
Artikel
- 21. Datenbanken
Core Data - Erzeugung von Entitäten
21© FH AACHEN | Sebastian Meßingfeld
• Modellierung von Entitäten und deren
Beziehungen in Xcode
• automatische Generierung von ObjC-Klassen aus
Entitäten möglich
• Zugriff im Code über Core-Data Schnittstellen
- 23. Datenbanken
Core Data - Speichern von Datensätzen
23© FH AACHEN | Sebastian Meßingfeld
• Erzeugung einer Instanz einer Datenbank Entität
• „Casten“ auf zugehörige ObjC Klasse
• Zuweisung von Werte
• ggf. Validierung
• Speichern des Kontextes
- 24. Datenbanken
Core Data - Speichern von Datensätzen
"
// Artikel erzeugen"
Artikel *newArt = (Artikel *)[[NSManagedObject !
! !alloc]initWithEntity:@”Artikel" ! !
! !insertIntoManagedObjectContext:context];"
"
// Werte zuweisen"
newArt.artikelname = @”Name";"
newArt.artikelpreis = @1.1;"
newArt.artikelbild = @”xxx.jpg";"
newArt.artikelbeschreibung = @”Beschreibung";"
newArt.kategorie = (Kategorie *)newKat;"
"
// Kontext speichern"
[context save:&error];
24© FH AACHEN | Sebastian Meßingfeld
- 25. Datenbanken
Core Data – Laden von Datensätzen
25© FH AACHEN | Sebastian Meßingfeld
• Erstellen eines Entitäts-Modells für abzufragenden
Typen
• Abfrage gegen Persistierungsschicht erstellen
• mit Filtern
• mit Sortierung
• Abfrage ausführen
• Ergebnis-Array enthält Objekte vom Typen
- 26. Datenbanken
Core Data – Laden von Datensätzen
// Entitäts Modell erstellen"
NSEntityDescription *entitydescArtikel = ! !
![NSEntityDescription entityForName:@"Artikel" !
!inManagedObjectContext:context];"
"
// Datenbank abfragen"
NSFetchRequest *request = [[NSFetchRequest alloc]init]
[request setEntity:entitydescArtikel];"
"
// Ergebnis verarbeiten"
NSArray *matchingData = [context! ! ! !
! !executeFetchRequest:request error:nil];"
"
if (matchingData.count > 0) {"
for (Artikel *artikel in matchingData) {"
// Mach‘ was"
}"
}
26© FH AACHEN | Sebastian Meßingfeld
- 27. Datenbanken
Core Data – Persistierungsschicht
27© FH AACHEN | Sebastian Meßingfeld
• bereits implementiert
• für den Entwickler i.d.R nicht „sichtbar“
• wird aus erzeugten Entitäten generiert
• kann verschiedene Ausprägungen haben
• SQLite
• XML
• eigener Datenspeicher kann angegeben werden
• muss Beziehung der Entitäten beachten
- 30. Aufgaben
Befüllen der Persistierungsschicht unter Core Data
• im Code
• einmalig, beim ersten Start der Anwendung
• aus Dateien (CSV, XML, ...)
• mit der App mitgeliefert
• Download
• modifizieren der Persistierungsschicht (*.sqlite)
• Anwendung wird modelliert + erstellt
• Datenbank
• wird aus fertigen App entnommen
• mit den Daten befüllt
• App wird mit Angabe der gefüllten DB neu erstellt
30© FH AACHEN | Sebastian Meßingfeld
- 31. Aufgaben
Befüllen der Persistierungsschicht unter Core Data
• modifizieren der Persistierungsschicht (*.sqlite)
• eigene SQLite-Datenbank i.d.R nicht verwendbar
• Aufbau durch Core Data Model vorgegeben
(Spalten, Keys, ...)
• „Lösung“:
• Mac-Anwendung mit gleichem Core Data Model
erstellen
• Datenbank der Mac-Anwendung befüllen
• Datenbank für iOS-App verwenden
31© FH AACHEN | Sebastian Meßingfeld
- 33. Aufgaben
Daten-Export aus Datenbank: CSV
• keine Unterstützung in CocoaTouch vorhanden
• für einzelne Tabelle mit Ausgabe von formatierten Strings
möglich
33© FH AACHEN | Sebastian Meßingfeld
- 34. Aufgaben
Daten-Export aus Datenbank: CSV
"
for (NSArray *arr in data) {"
for (NSString __strong* str in arr) {"
str = [str stringByReplacingOccurrencesOfString:@"""
! ! !withString:@""" ];"
str = [str stringByReplacingOccurrencesOfString:@";"
! ! !withString:@";" ];"
}"
"
csv = [arr componentsJoinedByString:@"";""];"
csv = [NSString stringWithFormat:@""%@"n", csv];"
"
[myHandle seekToEndOfFile];"
[myHandle writeData:[csv ! ! ! ! "
dataUsingEncoding:NSUTF8StringEncoding]];"
}"
34© FH AACHEN | Sebastian Meßingfeld
- 35. Aufgaben
Daten-Export aus Datenbank: XML
• keine Unterstützung in CocoaTouch vorhanden
• Export als Property List
• XML-Struktur mit einfachen Datentypen
• Export von ObjC Objekten als verschachtelte Datenstruktur
35© FH AACHEN | Sebastian Meßingfeld
- 36. Aufgaben
Dateien-Import/Export vom Device (Entwicklung)
• Zugriff auf App-Dateisystem möglich
• nicht so „verschlossen“ wie oft angenommen
• im Simulator
• Abbild der lauffähigen Anwendungen auf
Entwicklungsrechner
• Ordnerstruktur mit Dateien, wie bspw. *.sqlite
• ~/Library/Application Support/iPhone Simulator ...
• auf Endgeräten
• Download / Upload eines App-Abbilds über
„Organizer“-Tool
• Drittanbieter-Tools: z.B. iExplorer (auch für
Endnutzer)
36© FH AACHEN | Sebastian Meßingfeld
- 38. Aufgaben
Dateien-Import/Export vom Device (Endnutzer)
• iTunes File Sharing
• über Flag in App-Konfiguration aktivierbar
• Austausch von Dateien: iOS-App <> Desktop
• über Documents-Ordnder der App
• für Endnutzer in iTunes sichtbar
38© FH AACHEN | Sebastian Meßingfeld
- 39. Aufgaben
Performance
• langsame I/O Zugriffe auf Datenbank /
Dateisystem
• Lösung: Lazy Loading von Daten(sätzen)
• Erzeugung von 10.000 Beispieldatensätzen
ca. 3 Minuten
39© FH AACHEN | Sebastian Meßingfeld
- 40. Aufgaben
Tools
• Xcode für Datenbank Modellierung
• Organizer / iTunes zum Datenaustausch
• SQLite-Editor für Zugriff auf Datenbank
• Navicat Premium
• Core Data Editor
40© FH AACHEN | Sebastian Meßingfeld