iphone开发中数据持久化之——嵌入式SQLite(三)
前两篇分别讨论了使用属性列表的数据持久化、使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式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来对数据进行存储和管理,这种方式不仅简单高效、而且扩展性强,使用范围广,支持类型多。
iphone开发中数据持久化之——嵌入式SQLite(三)的更多相关文章
- iphone开发中数据持久化之——属性列表序列化(一)
数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...
- iphone开发中数据持久化之——模型对象归档(二)
在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- iOS开发中数据持久化
使用几个小例子分别实现 归档NSKeyedArchiver.NSUserDefaults.plist文件数据存储,简单直观.代码地址
- iPhone开发中从一个视图跳到另一个视图有三种方法:
iPhone开发中从一个视图跳到另一个视图有三种方法: 1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。
iphone 开发中使用zbar时遇到的几个典型问题解决方法. 在近期的一个ios项目中使用到了一个二维码扫描库(Qrcode)--ZBar, 期间遇到2个问题. 1. zbar下载后使用其l ...
- iPhone开发中,关于视图跳转的总结(转)
iPhone开发中,关于视图跳转的总结 iPhone开发中从一个视图跳到另一个视图有三种方法: 1. self.view addSubView:view .self.window addSubView ...
- 在iPhone开发中实现解压缩gzip
在iPhone开发中实现解压缩gzip是本文要介绍的内容,最近做的一个东西中,需要从网络获取xml文件,但是该文件用了gzip压缩的.搜索一 下有人说gzip压缩的用urlrequest可以自己解压, ...
- iphone开发中调用系统打电话功能
iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...
随机推荐
- js接收复选框的值
<td><input type="checkbox" class="title" name="title" value=& ...
- 【转】windows消息16进制对应表
来源:http://blog.sina.com.cn/s/blog_962250db0101d4mj.html windows mobile编程,无论使用eVC还是.net CF,都脱不开window ...
- Revenge of Fibonacc
算法:搜索: In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence rela ...
- Oracle数据库之PL/SQL游标
1. 游标概念 字面意思是游动的光标,是指向上下文区域的句柄或指针. 在PL/SQL块中执行CRUD操作时,ORACLE会在内存中为其分配上下文区.用数据库语言来描述游标就是:映射在上下文区结果集中一 ...
- php读取memcache二进制数据
memcache作为一个数据中间层,经常用来做数据交换. 比如在某个系统内部我们规定如下的用户状态的信息,每个用户只需要存续52个字节. Key state#ID 如”state#10888” Val ...
- javascript使用正则表达式验证Email地址
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- data-theme 几种值的样式
代码片段: <div data-role="page"> <div data-role="header"> <h1>The ...
- 单列模式 (singleton pattern)
单列就是说一个类只能被实例化一次,重点是确保某个对象只有一个,不会有第2个. c# 的实现是这样的 代码来源 : http://www.cnblogs.com/zhili/p/3185302.html ...
- 如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位
(1)如何禁止KEIL初始化RAM为零? 1. 在KEIL Noinit 打钩 2. <1> 另须对需要热启动保持的变量用 _at_ 关键字指定某个区域,否则还是没用 <2>或 ...
- 51单片机C语言学习笔记8:单片机C51编程规范
1.单片机C51编程规范- 前言 为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范. 2.单片机C51编程规范-范围 本标准规定了程序设计人员进行程序设计时必须遵循的规范.本 ...