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 ...
随机推荐
- 手机Web网站,设置拒绝电脑访问
最近一段时间,都在使用Jquery-Mobile + MVC做手机Web,有一些心得.体会 下面介绍如何拒绝电脑访问手机网站 电脑的浏览器,跟手机的浏览器内核不一样,这是我设置拒绝访问的思路. 下面是 ...
- 历史执行Sql语句性能分析 CPU资源占用时间分析
SELECT HIGHEST_CPU_QUERIES.PLAN_HANDLE, HIGHEST_CPU_QUERIES.TOTAL_WORKER_TIME, Q.DBID, ...
- curl 命令使用
1.开启gzip请求curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte 2.监控网页的响应时间curl -o /dev/nu ...
- PHP Sessions
PHP Sessions PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中 ...
- (五)Angularjs - 依赖注入
如何找到API? AngularJS提供了一些功能的封装,但是当你试图通过全局对象angular去 访问这些功能时,却发现与以往遇到的库大不相同. 比如,AngularJS暴露了一个全局对象:angu ...
- 武汉科技大学ACM :1008: 小t和小w
Problem Description 小t最近学了C语言,他想要在女朋友小w面前展示一下自己的能力,小w喜欢如样例所示的图形, 想让小t写一个程序来输出这样的图形,小t拿到后感觉有点困难,小t不想在 ...
- Bash shell 笔记总结(一) 转自http://www.bubuko.com/infodetail-509992.html,谢谢原作者
本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变 ...
- jquery keypress事件浏览器兼容性
今天在做“财务管理系统”的时候,使用jquery的ajax从前台传递用户输入到后台,并保存到数据库,但是在前台为了界面的简介和一致性,没有使用按 钮来实现"确定"和"取消 ...
- iScroll 下拉刷新
<!doctype html> <html> <head> <meta charset="utf-8"> <script ty ...
- 生产环境搭建MySQL复制的教程(转)
[导读] 网络上有很多关于MySQL复制搭建的步骤和范例,以及手册上有一章完整的篇幅,讲述MySQL复制的原理.搭建步骤.优化等,但依然存在很多刚开始学习MySQL知识或者刚进入DBA行业的朋友咨询, ...