iOS开发之SQLite--C语言接口规范(五)——iOS开发使用SQLite实例
本篇博客就使用前面操作SQLite的知识来实现如何去插入,删除和更新数据。然后再把操作SQlite数据库常用的方法进行一个封装。把常用方法进行封装后,把Cars数据库中的其中一个表的数据进行查询,并在UITableView上进行展示。因为本实例要对数据库的数据进行modify(修改)操作 ,在iOS系统上呢,为了安全起见,在Bundle中的数据库资源是不允许进行数据的插入修改和删除操作的。在之前的博客中我们只进行了查询操作,所以从Bundle加载数据库资源文件是可行的。
如果对数据库进程insert, update, delete等操作,那么需要在打开数据库之前把Bundle中的数据库拷贝到沙盒中(每个App都有自己的沙盒,在没有越狱的机器上,App只可以访问自己的沙盒,这也是iOS比较安全的地方之一)。今天这篇博客会封装出一个操作SQLite数据库的工具类,并且调用这个工具类对数据库进行增删改查,实现一个小的实例。废话少说,直奔主题。
一、数据库操作工具类
为了操作数据库更为方便,对数据库操作:打开关闭数据库,无绑定值查询数据库,有绑定值查询数据库,插入数据,删除数据,更新数据等进行了简单的封装。当然有感兴趣的小伙伴可以继续完善,比如加上事务操作等。
工具类对外接口介绍
先来看一下封装的工具类对外的接口,然后介绍一下其使用方法。接口代码具体如下所示
//
// OperationSqliteTools.h
// SettingBundleDemo
//
// Created by Mr.LuDashi on 15/8/31.
// Copyright (c) 2015年 zeluli. All rights reserved.
// #import <Foundation/Foundation.h>
#import <sqlite3.h> @interface OperationSqliteTools : NSObject /*******************************
*功能:打开数据库
*参数:databaseName -- 数据库名称
*返回:数据库对象(sqlite3对象)
*******************************/
+ (sqlite3 *) openDatabaseWithName: (NSString *)databaseName; /*******************************
*功能:关闭数据库
*参数:database -- sqlite3 对象
*返回:空
*******************************/
+ (void) closeDatabaseWithName: (sqlite3 *)database; /*******************************
*功能:查询数据,无绑定变量
*参数:database -- sqlite3 对象, SQL:要执行的SQL查询语句
*返回:封装成数组的查询数据
*******************************/
+ (NSArray *) queryInfoWithDataBase: (sqlite3 *) database
WithSQL: (NSString *) SQL; /*******************************
*功能:查询数据,有绑定变量
*参数:database -- sqlite3 对象, SQL:要执行的SQL查询语句,parameter:绑定变量的值
*返回:封装成数组的查询数据
*******************************/
+ (NSArray *) queryInfoWithDataBase: (sqlite3 *) database
WithSQL: (NSString *) SQL
WithParameter: (NSArray *)parameter; /*******************************
*功能:插入数据
*参数:database -- sqlite3 对象, SQL:要执行的SQL插入语句,parameter:绑定变量的值
*返回:插入结果,YES:插入成功, NO:插入失败
*******************************/
+ (BOOL) insertDataWithDataBase: (sqlite3 *) database
WithSQL: (NSString *) SQL
WithParameter: (NSArray *)parameter; /*******************************
*功能:更新数据
*参数:database -- sqlite3 对象, SQL:要执行的SQL插入语句,parameter:绑定变量的值
*返回:插入结果,YES:更新成功, NO:更新失败
*******************************/
+ (BOOL) updateDataWithDataBase: (sqlite3 *) database
WithSQL: (NSString *) SQL
WithParameter: (NSArray *)parameter; /*******************************
*功能:删除数据
*参数:database -- sqlite3 对象, SQL:要执行的SQL插入语句,parameter:绑定变量的值
*返回:插入结果,YES:删除成功, NO:删除失败
*******************************/
+ (BOOL) deleteDataWithDataBase: (sqlite3 *) database
WithSQL: (NSString *) SQL
WithParameter: (NSArray *)parameter; /*******************************
*功能:打印出查询后的结果
*参数:array -- 结果数组
*返回:空
*******************************/
+ (void) displayResultWithArray: (NSArray *) array; @end
二、 接口的具体介绍
1、打开数据库
下面的接口是打开数据库功能,把数据库的名字传入如(Cars.sqlite),返回的是一个sqlite3的对象,你可以通过这个对象来对打开的数据库进行操作。在这个方法中,先去沙盒中查看是否有该数据库,如果有就直接打开。如果没有就从Bundle中把数据库资源复制到沙盒中,然后再从沙盒中打开。你要知道在Bundle中是无法去更改数据库中的数据的。下方是对外暴漏的接口。
/*******************************
*功能:打开数据库
*参数:databaseName -- 数据库名称
*返回:数据库对象(sqlite3对象)
*******************************/
+ (sqlite3 *) openDatabaseWithName: (NSString *)databaseName;
该接口实现的具体方法如下,在关键代码出都加了注释,阅读代码时可以看一下注释,对于代码的东西就不做过多的赘述了。
/*******************************
*功能:打开数据库
*参数:databaseName -- 数据库名称
*返回:数据库对象(sqlite3对象)
*******************************/
+ (sqlite3 *) openDatabaseWithName: (NSString *)databaseName{ //将数据库文件复制到沙盒中
NSFileManager *fileManager = [NSFileManager defaultManager]; //获取沙盒路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = paths[]; //拼接出数据库文件在沙盒中的路径
NSString *sqlPath = [documentDirectory stringByAppendingPathComponent:databaseName]; //判断沙盒中是否已经存在我们要打开的数据库文件
BOOL success = [fileManager fileExistsAtPath:sqlPath]; //不存在的情况,会从Bundle中把资源复制过去
if (!success) {
NSString *defautlDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; NSError *error = nil; success = [fileManager copyItemAtPath:defautlDBPath toPath:sqlPath error:&error]; if (!success) {
NSLog(@"%@", [error localizedDescription]);
}
}
//把路径转成C字符串
const char * filePath = [sqlPath UTF8String]; //声明sqlite3对象
sqlite3 * database = nil; //打开数据库
int result = sqlite3_open_v2(filePath, &database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); //成功打开
if (result == SQLITE_OK) {
return database;
} return nil;
}
2.关闭数据库
关闭数据库就比较简单了,直接把传入的sqlite3对象进行一个关闭即可,具体代码如下:
/*******************************
*功能:关闭数据库
*参数:database -- sqlite3 对象
*返回:空
*******************************/
+ (void) closeDatabaseWithName: (sqlite3 *)database{
sqlite3_close(database);
}
3. 代码好多,博客篇幅有限,就不一一的去往上粘贴代码了,具体代码实现回在GitHub上进行分享,gitHub连接请看本博客的末尾处,在代码中也是在关键部分添加了相应的注释。
三、实例实现
调用上述简单封装的方法实现实例,对Cars.sqlite数据中其中一个表进行操作。先读取数据库中的数据,在TableView上进行加载,然后可以对数据进行添加和删除操作,更新操作就不做演示了。在插入操作中有如果有这条数据就进行Replace,这变相是一个update操作。
下方是Demo的运行效果,为了体现数据插入和删除的变化效果,给我们的Cell添加了一个动画效果,便于观察数据的变化。这个Demo也会在Github上进行分享,你可以自己运行去看一下效果。下方是动态的运行效果。为了简化操作,点击加号会有预先设定好的数据进行插入(当然你可以把用户输入的数据进行一个添加),删除的话就是TableView自带的效果删除。
下方Demo的实现并没有什么困难之处,就是对TableView的简单操作,如果你感兴趣的话,可以从Github上进行clone,然后进行扩展,添加上搜索,更新等功能。关于CoreData的操作就要看之前的博客《iOS开发之表视图爱上CoreData》.
gitHub分享地址:https://github.com/lizelu/SQLiteResource
iOS开发之SQLite--C语言接口规范(五)——iOS开发使用SQLite实例的更多相关文章
- 李洪强iOS开发之OC[007] - 李洪强iOS开发之类的声明和实现
类的声明和实现 类是一类具有相同特征和共同行为的集合 小轿车 大卡车 挖掘机 (车) 车类 类名: Car 属性: 颜色 速度 轮字数 共同行为: 跑 停 载人 对象: 是类的具 ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- 李洪强iOS开发之Block和协议
李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...
- 李洪强iOS开发之iOS社区收集
李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...
- 李洪强iOS开发之iOS好文章收集
李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...
- 李洪强IOS开发之iOS好项目收集
李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...
随机推荐
- 服务器使用FTP命令行 无法传送文件 卡在150 Opening data channel for file transfer
猜测,是因FTP服务器采用了主动模式,在创建数据传输通道时,服务器会以一个随机的端口,连接回来. 临时解决方案: 因不知道请求回来使用的哪个段的端口,因此,暂时关闭了防火墙.即能正常传输文件了.
- css实现一行文字居中,多行文字居左
第一种方法: <style> *{margin:0;padding:0;} .box{width:500px;height:300px;border:1px solid #000;text ...
- html+css笔记
文档结构 1.html文档结构 ①文档类型声明 严格型(标准模式): <!DOCTYpE HTML> HTML5 XHTML 1.0:<!DOCTYpE html pUbL ...
- svn比对
svn版本管理, 先要把你项目添加到svn版本管理中,添加完之后,文件夹就有一个绿色的勾,已经被svn进程管理了. 文件夹里面,每一层级,都有一个.svn文件夹,这个很重要,就是靠这个存放原有的文件, ...
- Spring MVC篇二、使用JdbcTemplate进行数据库操作
上一篇只是一个简单的Spring MVC框架,接下来添加一些跟数据库的交互. 一.添加jdbc相关配置 在maven中添加相关依赖后,配置数据库访问参数及数据源.数据库参数使用配置文件,代码如下: ...
- js数组操作总结
1.数组的检测 ECMAScript3 if(value instanceof Array){ //执行操作 } 假定单一全局环境,如果网页存在多个框架,多个window,Array具有不 ...
- sass
本文来自阮一峰http://www.ruanyifeng.com/blog/2012/06/sass.html 学过CSS的人都知道,它不是一种编程语言. 你可以用它开发网页样式,但是没法用它编程.也 ...
- USACO翻译:USACO 2013 DEC Silver三题
USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...
- .NET面试题系列[12] - C# 3.0 LINQ的准备工作
"为了使LINQ能够正常工作,代码必须简化到它要求的程度." - Jon Skeet 为了提高园子中诸位兄弟的英语水平,我将重要的术语后面配备了对应的英文. .NET面试题系列目录 ...
- ABP理论学习之内嵌资源文件
返回总目录 本篇目录 介绍 创建内嵌文件 暴露内嵌文件 使用内嵌文件 介绍 在一个web应用中,有供客户端使用的javascript,css,xml等文件.它们一般是作为分离的文件被添加到web项目中 ...