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 ...
随机推荐
- Node.js脚本杀掉占用端口的进程
express默认端口为3000,由于实际需要改为3392,修改监听3392之后,没有成功,发现该端口被系统正占用,为了避免每次都手工停掉该系统调用,释放端口,故写了如下脚本. var cmd=pro ...
- innodb的innodb_buffer_pool_size和MyISAM的key_buffer_size
一. key_buffer_size 对MyISAM表来说非常重要. 如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%.合理的值取决于索引大小.数据量以及负载 -- 记住,MyISA ...
- [linux常用命令]查看当前文件夹或该文件夹下文件(夹)的大小
du -sh *(星号表示当前所有文件夹)可以查看当前目录下各个文件夹的大小,-s表示只显示当前文件夹(不加-s你可以看到所有文件夹下的子文件夹的大小,太多了),-h表示以合适的大小查看.(可以用- ...
- 微信企业号开发遇到的bug
a. 微信嵌入视频: a.1 视频元素播放时层级默认被顶置 a.1 视频播放后窗口无法通过css改变层级 a.2 视频播放后窗口无法通过css隐藏 解决方案:做个虚假的播放窗口,点击播放窗口(虚假的) ...
- Android应用开发中关于this.context=context的理解
在Android应用开发中,有的类里面需要声明一个Context的成员变量,然后还需要在该类的构造函数中加上this.context=context;这行代码.为什么要这么写呢?不写不行么? 先看下面 ...
- zabbix log(logrt) key的使用
今天看了篇帖子是关于如何利用zabbix 自带的key去读log,监控linux异常登陆,一直以来都是自己写脚本去读log的.就想看看这个zabbix log 这个key怎么样..好吧开始: 官方文档 ...
- HTML5 canvas图像绘制方法与像素操作属性和方法
图像绘制方法 drawImage() 向画布上绘制图像.画布或视频 像素操作属性和方法 width 返回 ImageData ...
- 活动倒计时代码(精确到毫秒)jquery插件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Android json操作之取得一个对象
1:服务端返回的json数据格式如下: {"id":"1001","name":"zhangsan","sco ...
- cf D. Broken Monitor
http://codeforces.com/contest/370/problem/D 题意:输入一张图,上面只有两个字符'w'和‘.’ ,如果可以用一个正方形把所有的‘w’围起来,所有的‘w’都在正 ...