一、SQLite3简介
SQLite3在存储和检索大量数据方面非常有效,它还能够对数据进行复杂的聚合,与使用对象执行这些操作相比,获得结果的速度更快。
例如,如果应用程序需要计算应用程序中所有对象中特殊字段的总和,或者如果需要只符合特定条件的对象的总和,SQLite3将可以执行该操作,而不需要将每个对象加载到内存中。从SQLite3获取聚合比将所有对象加载到内存中,然后计算它们值的总和要快几个数量级。作为一个羽翼丰满的嵌入式数据库,SQLite3包含使其速度更快(例如,通过创建可以加快查询速度的表索引)的工具。
SQLite3使用SQL(Structured Query Language,结构化查询语言)。SQL是与关系数据库交互的标准语言。关系数据库(包括SQLite3)和面向对象的编程语言使用完全不同的方法来存储和组织数据。这些方法非常不同,因而出现了用于在两者之间转换的各种技术以及很多库和工具。这些不同的技术统称为对象关系映射(object-relational mapping, ORM)。目前,有很多中ORM工具可用于Cocoa Touch,比如Core Data。
二、创建或打开数据库
使用SQLite3之前,必须打开数据库。用于执行此操作的命令sqlite3_open()将打开一个现有数据库,如果指定位置上不存在数据库,则它会创建一个新的数据库。下面是打开数据库的代码:
//打开数据库
-(void)openDB
{
//获取到sqlite数据库的路径
NSString *dbPath = [[NSBundle mainBundle] pathForResource:@"Plan" ofType:@"sqlite"];
//由于SQLite3是采用可移植的C,因此需要将NSString字符串类型转换成C字符串
const char *charPath = [dbPath UTF8String];
//打开数据库,如果等于SQLITE_OK,则表示数据库已成功打开
int result = sqlite3_open(charPath, &database);
if(result == SQLITE_OK)
{
NSLog(@"数据库打开成功");
}
else
{
NSLog(@"数据库打开失败");
}
}
如果result等于常量SQLITE_OK,则表示数据库已成功打开。应当注意的是,数据库文件的路径必须作为C字符串(而非NSString)传递。因为SQLite3数据库是采用可移植的C(而非Object-C)编写的,它不知道什么是NSString。幸好有一个NSString方法,该方法可以从NSString实例生成C字符串:
const char *charPath = [dbPath UTF8String];
三、关闭数据库
当你对SQLite3数据库执行完所有操作时,通过调用sqlite3_close()来关闭数据库:
//关闭数据库
-(void)closeDB
{
sqlite3_close(database);
}
四、更新、插入和删除数据库(创建一个表为例)
数据库将其所有数据存储在表中,可以通过SQL CREATE语句来创建一个新表,并使用sqlite_exec将其传递到打开的数据库,如下所示:
-(void)createTable
{
char *errorMessage;
const char *createSQL = "create table if not exists People (pID integer primary key autoincrement , pName text)";
int result = sqlite3_exec(database, createSQL, NULL, NULL, &errorMessage);
if(result == SQLITE_OK)
{
NSLog(@"表创建成功");
}
else
{
NSLog(@"出现错误:%s", &errorMessage);
}
}
执行该操作之前,需要检查result等于SQLITE_OK以确保命令成功运行。如果命令未成功运行,errorMessage将包含对所发生问题的描述。
函数sqlite3_exec用于针对SQLite3运行任何不返回数据的命令它用于执行更新、插入和删除操作。
五、查询数据库
从数据库中检索数据有点复杂,你必须首先通过向其输入SQL SELECT命令来准备该语法,并调用sqlite3_step()来依次遍历数据库:
-(void)query
{
NSString *querySQL = @"select * from Artist ";
sqlite3_stmt *statement;
//执行查询
int result = sqlite3_prepare(database, [querySQL UTF8String], -1, &statement, nil);
if (result == SQLITE_OK)
{
//如果查询有语句就执行step来添加数据
while (sqlite3_step(statement) == SQLITE_ROW)
{
int rowNum = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(statement, 1);
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
NSLog(@"第%d个为:%@", rowNum, fieldValue);
}
sqlite3_finalize(statement);
}
}
如果result等于SQLITE_OK,则你的语句已经准备成功,可以开始单步调试结果集。上面的例子是从数据库中检索int和NSString的示例。
如上所述,简单的数据库打开、关闭、创建表、修改、删除、查询等操作都是调用对应的方法即可。其实最主要的还是SQL语句应该写正确。