为了与数据库交互,应用程序采用 Apple 框架规定的 MVC 模式,并定义了 "模型" 类。
"数据访问" 类将是与数据库交互的唯一类。因此,如果需要模式更改或与数据库有关的其它更改,仅有一个地方需要更新。
按住 ctr 键的同时单击Classes 文件夹(在 [Project] 窗口中)。在 [File] 菜单中,从 [Add] 菜单选择 [New File]。
从左侧选择 [iPhone OS Cocoa Touch Class]。
选择新的 Objective-C 类。
确保所选的 [Subclass] 为 [NSObject]。
单击 [Next]。
将文件命名为 DataAccess.mm。扩展名 .mm 非常重要,因为它告知 Xcode 该文件包含 Objective-C 和 C++。
确保选中 [Also create DataAccess.h] 框。
对于 [Location],选择 Names/Classes 子文件夹。
单击 [Finish]。
应用程序启动时,需要初始化 UltraLite 数据库管理器并连接到本地数据库。为此,类将创建此数据访问对象的单个实例,并由 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; } |
在能够使用任何 UltraLite 类和方法前,必须导入 ulcpp 头文件。将以下内容添加到 DataAccess.h 中的现有导入:
#import "ulcpp.h" |
在可以打开连接前,数据库管理器 Init 方法用于初始化 UltraLite 运行时。初始化后,连接到数据库的尝试将显示数据库是否存在。将以下实例变量添加到 DataAccess 标头:
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; } } |
应用程序的数据库模式由含两列的单个表组成。Names 表包含使用 UUID 的 ID 列和将名称保存为 VARCHAR 的名称列。ID 列使用 UUID 轻松支持使用 MobiLink 从远程数据库的行插入。这一点在第 6 课:添加同步中进行讨论。
要在表视图中显示数据,要求各行均可使用从 1 开始的索引进行访问。为此,数据库在名称列使用升序的索引。各行的索引将等于其在按字母顺序排列的名称列表中的位置。
在 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; } |
openConnection 使用 createDatabase,因此 createDatabase 必须在 openConnection 前出现,或者其方法签名必须添加到头文件中。
添加 dealloc 方法以结束 UltraLite 运行时,
- (void)dealloc { NSLog(@"Finalizing DB Manager."); connection->Close(); ULDatabaseManager::Fini(); [super dealloc]; } And a fini method to release the instance, + (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,所以必须:
#import "DataAccess.h" |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |