本篇博客就使用前面操作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. NotificationCenter接收不到通知的原因

    今天在项目中遇到一个奇葩的事情,我在一个类中明明写了: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #00af ...

  2. USER STORIES AND USE CASES - DON’T USE BOTH

    We’re in Orlando for a working session as part of the Core Team building BABOK V3 and over dinner th ...

  3. 偶遇STM32 JTAG和SWD口(调试)被禁用无法下载,已经粗暴解决!

    处女座,为了板子走线美观,拉线方便,在项目量产前,还更改了原来外设的IO口,埋头苦干一天,移植ok,发现PB3一直不听使唤,好,加班检查代码,检查初始化,时钟,IO对应,然后试PCB板,是否短路,断路 ...

  4. C#中分割字符串输出字符数组

    来自博客园 http://www.cnblogs.com/yugen/archive/2010/08/18/1802781.html   1.用字符串分隔: using System.Text.Reg ...

  5. ES6(五) 数组扩展

    Array.of方法用于将一组值,转换为数组.  Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES ...

  6. Linux 系统的初始化配置

      1.零时配置网卡IP地址 2.配置永久生效IP地址   需要进如 cd /etc/sysconfig/network-scripts  找到网卡文件编辑 3.零时主机名的更改. 4.永久主机名的更 ...

  7. 数据库中数据DELETE了怎样恢复

    USE [BBDAS_FP_DATA] GO /****** Object: StoredProcedure [dbo].[Recover_Deleted_Data_Proc] Script Date ...

  8. .net 下新版highcharts本地导出图片bug处理

    最近公司要用到highcharts这个插件来生成图表,所以我花了点时间研究了下. 现在最新的版本是3.0.2,这js插件居多优点就不比多说了,demo官网上也很详细.但是优点不爽的地方是,导出图片这个 ...

  9. 使用Powershell收集服务器信息

    function Get-OSInfo         ([string]$Server) {           $object = Get-WmiObject  win32_computersys ...

  10. DOMO1

    以下是Demo首页的预览图 demo下载:http://www.eoeandroid.com/forum.php?mod=attachment&aid=NjE0Njh8ZTIyZDA2M2N8 ...