为了与数据库交互,应用程序采用 Apple 框架规定的 MVC 模式,并定义了 "模型" 类。
"数据访问" 类将是与数据库交互的唯一类。因此,如果需要模式更改或与数据库有关的其它更改,仅有一个地方需要更新。
在 [Project] 窗口中按住 ctrl 键的同时单击 [Classes] 文件夹。单击 [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.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; } } |
应用程序的数据库模式由含两列的单个表组成。Names 表包含使用 UUID 的 ID 列和将名称保存为 VARCHAR 的名称列。ID 列使用 UUID 轻松支持使用 MobiLink 从远程数据库的行插入。
在以下代码示例中,openConnection 使用 createDatabase,因此 createDatabase 必须在 openConnection 前出现,或者其方法签名必须添加到头文件中。
要在表视图中显示数据,要求各行均可使用从 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; } |
添加 dealloc 方法以结束 UltraLite 运行时:
- (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" |
在该点,您应构建应用程序以验证其是否可以正确构建。从 [Build] 菜单中,单击 [Build]。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |