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 ...
随机推荐
- JAVA Hibernate别名排序问题
今天在做统计功能的时候遇到这样一个问题,由于查询结果为统计的数据,即使用了sum方法生成的字段, else trigger_count end) as hitCount from TriggerSta ...
- vs2012加载EntityFrameWork框架,连接Oracel
近日公司用到.net MVC框架做接口,需连接到Oracel数据库,从网上查阅了一些资料,当然,从咱们博客园获益匪浅.然后结合自己所做,把使用过程中遇到的一些问题,及如何解决的整理如下,方便查阅,也有 ...
- Wcf资料收集
1.简介 http://www.tuicool.com/articles/mqYB32 使用规范 http://blog.51cto.com/zt/219 2.教程系列 http://www.cnbl ...
- (转)用JS判断ckeditor3.6版本编辑器内容为空的方法
因为编者我还是一个初学入门者,无论是JS还是PHP,都是懂了点皮毛.今天在研究ckeditor编辑器的时候遇到了一些问题,虽然这只是我的个人问题,但觉得可以分享给其他人,或许也有像我这样的初学者也会遇 ...
- 打开的IE网页不是最大化的解决方法
方法一:先把所有的IE窗口关了;只打开一个IE窗口;最大化这个窗口;关了它;OK,以后的默认都是最大化的了 方法二:先关闭所有的IE浏览器窗口,用鼠标右键点击快速启动栏的IE浏览器图标,在出现的快捷菜 ...
- Mysql中存储方式的区别
MySQL的表属性有:MyISAM 和 InnoDB 2种存储方式: MyISAM 不支持事务回滚 InnoDB 支持事务回滚 可以用 show create table tablename 命令看表 ...
- 3.4 C与汇编程序的相互调用
为了提高代码执行效率,内核源代码中有些地方直接使用了汇编语言编制.这就会涉及在两种语言编制的程序之间相互调用的问题. 函数调用包括从一块代码到另一块代码之间的双向数据传递和执行控制转移.数据传递通过函 ...
- 在 html 中用加色法混合颜色
概要 本文通过解决一个假想的问题介绍了 css screen 混合模式,并介绍了如何用 svg 滤镜.canvas 2d.canvas webgl 实现相同的效果. 问题 下面的图片演示三种颜色光叠加 ...
- JavaScript中的memorizing技术
今天看<JavaScript>设计模式第七章--工厂模式的时候接触到memorizing技术,简单的说就是对于某个方法,调用它的实例只在第一次调用它的时候才会进行方法中的计算,之后该实例再 ...
- 转载:Struts2.3.15.1升级总结
转载网址:http://blog.csdn.net/amosryan/article/details/10350481 由于大家都懂的原因,涉struts2的项目需要将struts2相关包升级至2.3 ...