前两篇分别讨论了使用属性列表的数据持久化、使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式SQL数据库SQLite3。SQLite3在存储和检索大量数据方面非常有效。它还能够对数据进行复杂的聚合,与使用对象执行这些操作相比,获得结果的速度更快。SQLite3使用SQL,SQL是用于关系数据库的标准语言,并且有自己的语法语言,具体的可以参考SQL相关教程。本文将介绍如何应用iphone应用程序中进行设置并与SQLite数据库交互,实现数据的存储与检索等。 如果先前没有接触SQL,建议先阅读下相关的SQLite相关书籍,比如《全面解析SQLite》、《SQLite权威指南》。
在调用Sqlite3之前,首先要添加libsqlite3.dylib动态库,由于系统中该库是隐藏的,浏览时看不到,所有在添加的时候需要看到文件,先上张图,然后介绍添加ibsqlite3.dylib的方法。
点击工程target,然后右键选择”add to project...",导航到上面的也页面,也即选中macintoshHD,然后在搜索框中输入“libsqlite3",然后点击”save"边的“+”,选择上图的“system file"以及选择”are included",这样就可以找到该动态库,选择添加即可将该动态库添加到工程中。下面就来在iphone中使用SQLite3实现数据的持久化保存。
1)创建或打开数据库
使用SQLite3之前,必须打开数据库。用于执行此操作的命令是sqlite3_open()将打开一个现有的数据库,如果指定位置上不存在数据库,则它会创建一个新的数据库。下面是一个打开数据库的实例代码:
sqlite3* database;
int result = sqlite3_open(path,&database);
上面代码中,从指定的path中打开一个数据库文件,如果该文件不存在,则创建一个新的数据库。返回值result如果为常量SQLITE_OK,则表示成功打开数据库。 其中注意一点,在涉及sqlite的语句中,都必须是C字符串,而不是NSString,当然可以采用objective-c提供的UTF8String将NSString转换为C格式的字符串,如:
NSString* createSql = @"CRETE TABLE IF NOT EXISTS FIELDS(ROW INTEGER PRIMARY KEY,FIELD_DATA TEXT);";
char* strsql = [createSql UTF8String];
2)执行数据库操作
打开了数据库文件后,就可以对其进行增删减查等操作。在libsqlite库中提供了sqlite3_exec函数来实现对数据库执行无返回的操作(即数据库插入、更新和删除等),代码如下:
NSString* createSql = @"CRETE TABLE IF NOT EXISTS FIELDS(ROW INTEGER PRIMARY KEY,FIELD_DATA TEXT);";
int result = (sqlite3_exec(database, [createSql UTF8String], NULL, NULL, &errorMsg);
3)数据库查询操作
数据库的查询操作相对复杂点,在libsqlite中也提供了用于查询的操作函数sqlite3_prepare_v2(当然还有很多其他的函数),操作代码如下:
NSString* query =@"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";
sqlite3_stmt* statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil)==SQLITE_OK)
{
while (sqlite3_step(statement)==SQLITE_ROW)
{
int row = sqlite3_column_int(statement, 0);
char* rowData = (char*)sqlite3_column_text(statement, 1); NSString* fileName = [[NSString alloc]initWithFormat:@"field%d",row]; NSString* fieldValue = [[NSString alloc]initWithUTF8String:rowData];
UITextField* field = [self valueForKey:fileName];
field.text = fieldValue;
}
sqlite3_finalize(statement);
}
4)数据库关闭
对完成了对数据库的访问操作后,就要对数据库执行关闭操作,调用函数:sqlite3_close(database);。
本工程的其他代码与前面两个工程类似,这里就不再提供下载了。通过这三篇博文,我们可以了解在iphone中实现数据持久化的方法,其实还有很多其他的方法,如直接保存在文件中。尽管,三种方式实现的效果相同,但第一种通过属性列表实现的方式适用范围较小,一般只应用于数据量较小而且不频繁变动的类型;而第二种对同对象归档方法实现的数据持久化方法,也只适用于小规模的数据保存;针对应用程序中数据量偏大的情况,建议使用第三种方式,也即sqlite3来对数据进行存储和管理,这种方式不仅简单高效、而且扩展性强,使用范围广,支持类型多。