データベースと対話するために、アプリケーションは、Apple フレームワークによって規定されている MVC パターンに従って、Model クラスを定義します。
Data Access クラスは、データベースと対話する唯一のクラスです。このため、スキーマの変更またはその他のデータベース関連の変更が必要な場合、更新は 1 箇所のみ必要となります。
[プロジェクト] ウィンドウの [クラス] フォルダーを、[control] キーを押したままクリックします。[追加] » [新規ファイル] をクリックします。
左側のリストから [iPhone OS Cocoa タッチクラス] をクリックします。
新規 Objective-C クラスをクリックします。
選択したクラスの [Subclass] が [NSObject] であることを確認します。
[次へ] をクリックします。
ファイルに DataAccess.mm という名前を付けます。.mm 拡張子は、ファイルに Objective-C と C++ の両方が含まれていることを Xcode に通知するため、重要です。
[同時に"DataAccess.h"も作成する] がオンになっていることを確認します。
[保存場所] として names/Classes サブフォルダーをクリックします。
[完了] をクリックします。
アプリケーションでは、起動した後、Ultra Light のデータベースマネージャーを初期化して、ローカルデータベースに接続する必要があります。このことを行うために、クラスによって、このデータアクセスオブジェクトのシングルトンインスタンスが作成されます。このインスタンスは、名前のリストを表示および管理するために RootViewController によって使用されます。
DataAccess.mm ファイルに、実装内の次のコードを追加します。
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; } |
Ultra Light のクラスとメソッドを使用できるようにするには、ulcpp ヘッダーファイルをインポートする必要があります。次の行を、DataAccess.h の既存のインポートに追加します。
#import "ulcpp.h" |
接続を開く前に、データベースマネージャーの Init メソッドを使用して、Ultra Light ランタイムを初期化します。初期化されると、データベースへの接続が試行され、これにより、データベースが存在するかどうかが示されます。次のインスタンス変数を DataAccess.h ヘッダーのインターフェイスブロック内に追加します。
ULConnection * connection; |
DataAccess.mm ファイルに、実装内の次のコードを追加します。
- (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; } } |
アプリケーションのデータベーススキーマは、2 つのカラムを持つ単一テーブルで構成されています。Names テーブルには、UUID を使用する ID カラムと、名前を VARCHAR として格納する name カラムがあります。Mobile Link を使用したリモートデータベースからのロー挿入を容易にサポートできるように、ID カラムでは UUID を使用します。
次のコード例では、openConnection では createDatabase が使用されるため、createDatabase を openConnection の前に指定するか、または、メソッドシグネチャーをヘッダーファイルに追加してください。
テーブルビューにデータを表示するには、1 から始まるインデックスを使用して各ローにアクセスできる必要があります。このことを行うために、データベースでは name カラムに昇順インデックスを使用します。各ローのインデックスは、名前のアルファベット順リスト内の位置と同じです。
DataAccess.mm ファイルに、実装内の次のコードを追加します。
- (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; } |
Ultra Light ラインタイムをファイナライズするために、dealloc メソッドを追加します。
- (void)dealloc { NSLog(@"Finalizing DB Manager."); connection->Close(); ULDatabaseManager::Fini(); [super dealloc]; } |
インスタンスを解放する fini メソッドを追加します。
+ (void)fini { [sharedInstance release]; } |
ヘッダーファイルのインターフェイスの中括弧ブロックの後にメソッドシグネチャーを追加します。
// Release objects. - (void)dealloc; // Singleton instance of the DataAccess class. + (DataAccess*)sharedInstance; // Finalize the Database Manager when done with the DB. + (void)fini; |
NamesAppDelegate の applicationWillTerminate メソッドから fini メソッドを呼び出します。
- (void)applicationWillTerminate:(UIApplication *)application { // Save data if appropriate [DataAccess fini]; } |
また、アプリケーションデリゲートが fini を呼び出しているため、DataAccess ヘッダーファイルをインポートする必要があります。次のコードを namesAppDelegate.h に追加します。
#import "DataAccess.h" |
この時点で、アプリケーションを構築して、エラーなしに構築できるかどうかをテストする必要があります。[ビルド] メニューで [ビルド] をクリックします。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |