Für die Interaktion mit der Datenbank folgt die Anwendung dem MVC-Muster, das vom Apple-Framework vorgeschrieben wird, und legt eine Modellklasse fest.
Die Data Access-Klasse ist die einzige Klasse, die mit der Datenbank interagiert. Wenn daher eine Schemaänderung oder eine andere datenbankbezogene Änderung erforderlich ist, sind Aktualisierungen nur an einer Stelle nötig.
Klicken Sie bei gedrückter Control-Taste im Fenster Project auf den Ordner Classes. Klicken Sie auf Add » New File.
Klicken Sie in der linken Auswahl auf iPhone OS Cocoa Touch Class.
Klicken Sie auf eine neue Objective-C-Klasse.
Vergewissern Sie sich, dass die Subclass der Auswahl NSObject ist.
Klicken Sie auf Weiter.
Nennen Sie die Datei DataAccess.mm. Die Erweiterung .mm ist wichtig, weil sie Xcode signalisiert, dass die Datei sowohl Objective-C als auch C++ enthält.
Achten Sie darauf, dass die Option Also create DataAccess.h ausgewählt ist.
Klicken Sie unter Location auf den Unterordner names/Classes.
Klicken Sie auf Fertig stellen.
Wenn die Anwendung gestartet wird, muss sie den UltraLite-Datenbankmanager initialisieren und eine Verbindung mit der lokalen Datenbank herstellen. Dazu erstellt die Klasse eine Singleton-Instanz dieses Datenzugriffobjekts, die vom RootViewController verwendet wird, um die Liste der Namen anzuzeigen und zu verwalten.
In der DataAccess.mm-Datei fügen Sie den folgenden Programmcode in der Implementierung hinzu:
static DataAccess * sharedInstance = nil; + (DataAccess *)sharedInstance { // Create a new instance if none was created yet if (sharedInstance == nil) { sharedInstance = [[super alloc] init]; [sharedInstance openConnection]; } // Otherwise, just return the existing instance return sharedInstance; } |
Bevor Sie UltraLite-Klassen und -Methoden verwenden können, müssen Sie die ulcpp-Header-Datei importieren. Fügen Sie die folgende Zeile zu den vorhandenen Importen in DataAccess.h hinzu:
#import "ulcpp.h" |
Bevor die Verbindung geöffnet werden kann, wird die Init-Methode des Datenbankmanagers verwendet, um die UltraLite-Laufzeitumgebung zu initialisieren. Nach der Initialisierung zeigt ein Versuch, eine Verbindung mit der Datenbank herzustellen, ob die Datenbank vorhanden ist. Fügen Sie die folgende Instanzvariable in den DataAccess.h-Header im Schnittstellenblock ein:
ULConnection * connection; |
In der DataAccess.mm-Datei fügen Sie den folgenden Programmcode in der Implementierung hinzu:
- (void)openConnection { NSLog(@"Connect to database."); if (ULDatabaseManager::Init()) { NSArray * paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentsDirectory = [paths objectAtIndex:0]; NSString * writableDBPath = [documentsDirectory stringByAppendingPathComponent: @"Names.udb"]; ULConnection * conn = nil; const char * connectionParms; ULError error; connectionParms = [[NSString stringWithFormat:@"DBF=%@", writableDBPath] UTF8String]; // Attempt connection to the database conn = ULDatabaseManager::OpenConnection( connectionParms, &error); // If database file not found, create it and create the schema if (error.GetSQLCode() == SQLE_ULTRALITE_DATABASE_NOT_FOUND) { conn = [self createDatabase:connectionParms]; } connection = conn; } else { NSLog(@"UL Database Manager initialization failed."); connection = nil; } } |
Das Datenbankschema der Anwendung besteht aus einer einzelnen Tabelle mit zwei Spalten. Die Names-Tabelle enthält eine ID-Spalte mit UUIDs und eine name-Spalte, in der die Namen als VARCHAR-Werte gespeichert werden. Die ID-Spalte verwendet UUIDs zur einfachen Unterstützung von Zeileneinfügungen aus entfernten Datenbanken mit MobiLink.
In den folgenden Code-Beispielen verwendet openConnection createDatabase, sodass entweder createDatabase vor openConnection stehen oder die dazugehörige Methodensignatur der Header-Datei hinzugefügt werden muss.
Das Anzeigen von Daten in einer Tabellenansicht erfordert, dass jede Zeile über einen 1-basierten Index zugänglich ist. Dazu benutzt die Datenbank einen aufsteigenden Index für die name-Spalte. Der Index jeder Zeile ist gleich seiner Position in der alphabetischen Liste der Namen.
In der DataAccess.mm-Datei fügen Sie den folgenden Programmcode in der Implementierung hinzu:
- (ULConnection *)createDatabase:(const char *)connectionParms { const char * CREATE_TABLE = "CREATE TABLE Names (" "id UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY," "name VARCHAR(254) NOT NULL)"; const char * CREATE_INDEX = "CREATE UNIQUE INDEX namesIndex ON Names(name ASC)"; const char * createParms = "page_size=4k;utf8_encoding=true;collation=UTF8BIN"; ULError error; ULConnection * conn; conn = ULDatabaseManager::CreateDatabase( connectionParms, createParms, &error); if (!conn) { NSLog(@"Error code creating the database: %ld", error.GetSQLCode()); } else { NSLog(@"Creating Schema."); conn->ExecuteStatement(CREATE_TABLE); conn->ExecuteStatement(CREATE_INDEX); } return conn; } |
Fügen Sie eine dealloc-Methode hinzu, um die UltraLite-Laufzeitumgebung zu finalisieren:
- (void)dealloc { NSLog(@"Finalizing DB Manager."); connection->Close(); ULDatabaseManager::Fini(); [super dealloc]; } |
Fügen Sie eine fini-Methode hinzu, um die Instanz freizugeben:
+ (void)fini { [sharedInstance release]; } |
Fügen Sie die Methodensignaturen der Header-Datei nach dem Schnittstellenblock in den geschweiften Klammern hinzu:
// Release objects. - (void)dealloc; // Singleton instance of the DataAccess class. + (DataAccess*)sharedInstance; // Finalize the Database Manager when done with the DB. + (void)fini; |
Rufen Sie die fini-Methode in NamesAppDelegate über die applicationWillTerminate-Methode auf:
- (void)applicationWillTerminate:(UIApplication *)application { // Save data if appropriate [DataAccess fini]; } |
Da der Anwendungsdelegat fini aufruft, muss er die DataAccess-Header-Datei importieren. Fügen Sie namesAppDelegate.h Folgendes hinzu:
#import "DataAccess.h" |
Zu diesem Zeitpunkt sollten Sie Anwendung erstellen, um zu testen, ob sie ohne Fehler erstellt wird. Klicken Sie im Menü Build auf Build.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |