iPhone 和 Android 都有嵌入式的SQL数据库,名为SQLite3,作为一种持久性存储的工具,SQLite3在存储和检索大量数据方面非常有效,具有良好的性能和速度。
关系数据库(包括SQLite3)和面向对象的编程语言使用完全不同的方法来存储和组织数据。因而出现了在两者之间转换的各种技术以及库和工具。这些不同的技术统称为对象关系映射(Object-relational Mapping,ORM),例如苹果公司为iPhone Cocoa Touch提供的一种ORM解决方案Core Data。
SQLite3安装运行
MacOS X内置有SQLite3,如果没有或想升级,请到官网下载http://sqlite.org/download.html。 SQLite 官网使用手册:Command Line Shell For SQLite (http://sqlite.org/sqlite.html)。设置项目使用SQLite3
要使用SQLite3 API,需要将应用程序连接到一个名为libsqlite3.dylib的动态库。在Mac OS X和iPhone上,该库位于/usr/lib中。- 在Groups & Files窗格中选中Frameworks
- 从Project菜单中选择Add to Project...
- 导入/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulatorX.Y.sdk/usr/lib.找到libsqlite3.dylib文件,取消选中Copy items into destination group's folder(if needed)复选框
使用iPhone 的嵌入式 SQLite3的基本步骤
- 创建或打开数据库 使用SQLite3之前,必须打开数据库,如果指定位置上不存在数据库,则它会自动创建一个新的数据库,下面是打开或创建新数据库的代码:
- 创建表
- 插入数据(绑定变量) 处理字符串并确保它们没有无效字符以及引号处理过的属性是件非常烦琐的事情。使用绑定变量可解决这些问题:
- 检索数据 从数据库中检索数据有点复杂:
- 关闭数据库 当对SQLite3数据库执行完所有操作时,通过以下代码关闭:
sqlite3 *database;
int result = sqlite3_open("/path/to/database/file", &database);
char * errorMsg;
const char *createSQL = "CREATE TABLE IF NOT EXISTS TABLE1 (
ID INTEGER PRIMARY KEY AUTOINCREMENT, FIELD_DATA TEXT)";
int result = sqlite3_exec (database, createSQL, NULL, NULL, &errorMsg);
函数sqlite3_exec用于针对任何不返回数据的命令,比如执行更新、插入和删除操作。
char *sql = "INSERT INTO TABLE1 VALUES (?, ?)";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 235);
sqlite3_bind_text(stmt, 2, "Bar", -1 , NULL);
}
NSString *query = @"SELECT ID, FIELD_DATA FROM TABLE1 ORDER BY ROW";
sqlite3_stmt *statement;
int result = (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil);
如果result等于SQLITE_OK,则开始单步获取结果集:
while (sqlite3_step(statement) == SQLITE_ROW) {
int rowNum = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(satement, 1);
NSString *fieldValue = [[NSString alloc] initWithUIF8String:rowData];
// Do someting with the data here
[fieldValue release];
}
sqlite3_finalize(statement);
sqlite3_close(database);

