本篇博客就使用前面操作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实例的更多相关文章

  1. 李洪强iOS开发之OC[007] - 李洪强iOS开发之类的声明和实现

    类的声明和实现 类是一类具有相同特征和共同行为的集合 小轿车   大卡车   挖掘机    (车) 车类 类名: Car 属性: 颜色  速度  轮字数 共同行为: 跑  停  载人 对象: 是类的具 ...

  2. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  3. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  4. iOS 开发之Block

    iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1.     按钮事件 target action 机制. 它是将一 ...

  5. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  6. 李洪强iOS开发之Block和协议

    李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...

  7. 李洪强iOS开发之iOS社区收集

    李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...

  8. 李洪强iOS开发之iOS好文章收集

    李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...

  9. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

随机推荐

  1. asp.net mvc3登录验证

    1,在web.config中  <system.web>节点下面增加: <authentication mode="Forms"> <forms na ...

  2. vue.js的基本操作

    1.{{message}}输出data数据中的message. 2.v-for="todo in todos"输出data数据中的dotos数组 3.v-on:click=&quo ...

  3. python 之 Django 基础篇

    1,Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据 ...

  4. SpringMVC4 实例

    之前我先创建普通web项目,再直接添加maven框架.结果springMVC框架一直不能正确的访问控制器. 但通过以下方式创建maven web项目就能获得正确的架构路径. 1.新建一个maven项目 ...

  5. windows下装多个node版本的方法(gnvm)

      安装一个支持windows切换node版本的工具 工作中我们可能需要用到一些工具,但这些工具依赖不同版本的node环境,那我们需要来为的切换node的环境吗, window msi安装的用户需要卸 ...

  6. cocos2dx 实现flappybird

    前两天在博客园看到网友实现的一个网页版的flappy bird,挂在360游戏平台,玩了一会儿得分超低,就很想自己做一个.刚好这两天炫舞的活都清了,就弄一下玩玩. 效果图 布局类GameScene.h ...

  7. 网站中使用中文个性字库字体--@font-face解决方案探索 l(转)

    最近的项目有用到特别中文字体,最终效果如下图: 红线标记处均为字体,可选中,交互起来,比图片方便太多了. 解决思路就是将体积巨大的中文字库,取子集,只包涵要使用的那部分文字,因此体积就很小了(包含10 ...

  8. SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  9. Hibernate框架使用案例

    Hibernate是对JDBC进行了轻量级封装的ORM框架,充当项目的持久层 Hibernate依赖的库: 创建一个工程,添加jar包: hibernate.cfg.xml: <!DOCTYPE ...

  10. 华为oj 字符串最后一个单词的长度

    <img alt="http://img.bbs.csdn.net/upload/201508/06/1438867109_670158.jpg" src="htt ...