目录:

一、sqlite3常用函数

二、将sqlite3集成到项目,实现増删改查

三、封装DBManager

四、Demo

一、sqlite3常用函数及解释

(1)sqlite3_open:

用来创建和打开数据库文件,接收两个参数,第一个是数据库的名字,第二个是数据库的句柄。如果数据库文件不存在,将首先新建它,然后再打开它,否则只是打开它。

(2)sqlite3_prepare_v2:

使用格式化的字符串来获得sql准备语句(prepared statement),然后转化为可被SQLite3识别的执行语句。(实际上这个函数并不执行这个SQL语句)

(3)sqlite3_step:

这个函数执行上一个函数调用创建的准备语句,这个语句执行到结果的第一行可用的位置,再次调用sqlite3_setp(),会继续前进到结果的第二行。当执行插入、更新、删除操作时会被调用一次,当执行取回数据时可以执行多次。这个函数不能在sqlite3_preprare_v2之前调用。

(4)sqlite3_column_count:

返回表的列数

(5)sqlite3_column_text:

以text的格式返回列的内容(实际上是C的char*类型)。它接收两个参数,SQLite语句和列的索引。

(6)sqlite3_column_name:

返回列的名字,参数和上一个函数一样

(7)sqlite3_changes:

返回执行语句后受影响的行数

(8)sqlite3_last_insert_rowid:

返回最后插入的行的id

(9)sqlite3_errmsg:

返回SQLite错误描述

(10)sqlite3_finalize:

从内存删除之前sqlite3_prepare_v2函数创建的准备语句


(11)sqlite3_close:

关闭数据库连接,在结束任何数据库数据修改后调用,它将释放其存储的系统资源。

二、将sqlite3集成到项目,实现増删改查

1.首先需要将SQLite3的库添加到工程,输入sqlite,从推荐选项中选择libsqlite3.dylib  ,如下图。

2.导入sqlite3的头文件 :#import <sqlite3.h>
3.定义宏,方便后面使用,并声明一个sqlite3 句柄
#define DBNAME    @"myDB.sqlite"
#define TABLENAME @"PERSONINFO"
#define NAME      @"name"
@interface ViewController (){sqlite3 *db;
}
3.创建和打开数据库文件
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documents = [paths objectAtIndex:0];NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];    if (sqlite3_open([database_path UTF8String], &db)!= SQLITE_OK) {sqlite3_close(db);NSLog(@"打开数据库失败");}

4. 新建一个sql语句操作数据库的函数

-(void)execSql:(NSString *)sql
{  char *err;  if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {  sqlite3_close(db);  NSLog(@"数据库操作数据失败!");  }
}  

5.创建数据表,表名为2中的宏定义PERSONINFO

NSString *sqlCreateTable = @"CREATE TABLE IF NOT EXISTS PERSONINFO(peopleInfoID integer primary key, firstname text, lastname text, age integer);";
[self execSql:sqlCreateTable];  

6.插入一条名字为张三,年龄22岁的记录

NSString *sql = [NSString stringWithFormat:@"insert into peopleInfo values(null, '%@', '%@', %d)", @“张”,@“三”,22]; [self execSql:sql];
7.查询所有记录
NSString *sqlQuery = @"SELECT * FROM PERSONINFO";  sqlite3_stmt * statement;  if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {  while (sqlite3_step(statement) == SQLITE_ROW) {  char *firstName = (char*)sqlite3_column_text(statement, 1);  NSString *firstNameStr = [[NSString alloc]initWithUTF8String:firstName];  <pre name="code" class="objc">           char *lastName = (char*)sqlite3_column_text(statement, 2);  NSString *lastNameStr = [[NSString alloc]initWithUTF8String:lastName];  

int age = sqlite3_column_int(statement, 3); NSLog(@"firstName:%@ lastName:%@ age:%d",firstNameStr,lastNameStr, age);
} } sqlite3_close(db);

三、封装DBManager

(1)新建一个添加一个DBManager类: 选择File > New > File…,选择 Cocoa Touch Class,单击下一步,按如图所示操作。

(2).h文件
#import <Foundation/Foundation.h>@interface DBManager : NSObject@property (nonatomic, strong) NSMutableArray *arrColumnNames;//存储列名
@property (nonatomic) int affectedRows;//记录被改变的行数
@property (nonatomic) long long lastInsertedRowID;//记录最后插入行的id-(NSArray *)loadDataFromDB:(NSString *)query;//查询
-(void)executeQuery:(NSString *)query;//插入、更新、删除
-(instancetype)initWithDatabaseFilename:(NSString *)dbFilename;//初始化方法
-(BOOL)createTableWithSql:(const char *)sql_stmt;//新建表@end

(3).m文件

#import "DBManager.h"
#import <sqlite3.h> //导入sqlite3的头文件@interface DBManager()@property (nonatomic, strong) NSString *documentsDirectory;
@property (nonatomic, strong) NSString *databaseFilename;
@property (nonatomic, strong) NSMutableArray *arrResults;@end@implementation DBManager-(instancetype)initWithDatabaseFilename:(NSString *)dbFilename{self = [super init];if (self) {//获得存储路径NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);self.documentsDirectory = [paths objectAtIndex:0];//数据库名self.databaseFilename = dbFilename;}return self;
}#pragma mark 建表
-(BOOL)createTableWithSql:(const char *)sql_stmt{BOOL isSuccess = YES;//检查数据库文件是否已经存在NSString *destinationPath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];NSLog(@"path:%@",destinationPath);if (![[NSFileManager defaultManager] fileExistsAtPath:destinationPath]) {sqlite3 *database = nil;const char *dbpath = [destinationPath UTF8String];if (sqlite3_open(dbpath, &database) == SQLITE_OK){char *errMsg;if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg)!= SQLITE_OK){isSuccess = NO;NSLog(@"Failed to create table");}sqlite3_close(database);}else{isSuccess = NO;NSLog(@"Failed to open/create table");}}return isSuccess;
}#pragma mark 执行sql语句
-(void)runQuery:(const char *)query isQueryExecutable:(BOOL)queryExecutable{//创建一个sqlite3对象sqlite3 *sqlite3Database;//设置数据库路径NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];//初始化存储结果的arrayif (self.arrResults != nil) {[self.arrResults removeAllObjects];self.arrResults = nil;}self.arrResults = [[NSMutableArray alloc] init];//初始化存储列名的arrayif (self.arrColumnNames != nil) {[self.arrColumnNames removeAllObjects];self.arrColumnNames = nil;}self.arrColumnNames = [[NSMutableArray alloc] init];//打开数据库BOOL openDatabaseResult = sqlite3_open([databasePath UTF8String], &sqlite3Database);if(openDatabaseResult == SQLITE_OK) {//声明一个sqlite3_stmt对象,存储查询结果sqlite3_stmt *compiledStatement;//将所有数据加载到内存BOOL prepareStatementResult = sqlite3_prepare_v2(sqlite3Database, query, -1, &compiledStatement, NULL);if(prepareStatementResult == SQLITE_OK) {//是否是查询语句if (!queryExecutable){//用来保存每一行数据NSMutableArray *arrDataRow;//将结果一行行地加入到arrDataRow中while(sqlite3_step(compiledStatement) == SQLITE_ROW) {//初始化arrDataRowarrDataRow = [[NSMutableArray alloc] init];//获得列数int totalColumns = sqlite3_column_count(compiledStatement);//读取和保存每一列数据for (int i=0; i<totalColumns; i++){//将数据转化为charchar *dbDataAsChars = (char *)sqlite3_column_text(compiledStatement, i);//数据不为空则加到arrDataRow中if (dbDataAsChars != NULL) {//将char转化为string.[arrDataRow addObject:[NSString  stringWithUTF8String:dbDataAsChars]];}//保存列名(只保存一次)if (self.arrColumnNames.count != totalColumns) {dbDataAsChars = (char *)sqlite3_column_name(compiledStatement, i);[self.arrColumnNames addObject:[NSString stringWithUTF8String:dbDataAsChars]];}}//如果不为空,将每行的数据保存到if (arrDataRow.count > 0) {[self.arrResults addObject:arrDataRow];}}}else {//插入、更新、删除等操作if (sqlite3_step(compiledStatement) == SQLITE_DONE) {// 被改变了多少行self.affectedRows = sqlite3_changes(sqlite3Database);// 最后插入的行idself.lastInsertedRowID = sqlite3_last_insert_rowid(sqlite3Database);}else {// 插入、更新、删除等错误NSLog(@"DB Error: %s", sqlite3_errmsg(sqlite3Database));}}}else {//打开错误NSLog(@"%s", sqlite3_errmsg(sqlite3Database));}// 释放内存sqlite3_finalize(compiledStatement);}// 关闭数据库sqlite3_close(sqlite3Database);
}-(NSArray *)loadDataFromDB:(NSString *)query{// 执行查询[self runQuery:[query UTF8String] isQueryExecutable:NO];// 返回查询结果return (NSArray *)self.arrResults;
}-(void)executeQuery:(NSString *)query{// 执行插入、更新、删除等[self runQuery:[query UTF8String] isQueryExecutable:YES];
}@end

四、使用三中DBManager完成一个Demo,实现增删改查,效果如下图,源代码:http://download.csdn.net/detail/dolacmeng/8816001

【iOS】sqlite3的使用(増删改查)相关推荐

  1. iOS开发-plist文件增删改查

    plist第一次看到这个后缀名文件的时候感觉怪怪的,不过接触久了也就习以为常了,plist是Property List的简称可以理解成属性列表文件,主要用来存储串行化后的对象的文件.扩展名为.plis ...

  2. python自带数据库SQLite3,实现增删改查,及初始化重复操作

    一.SQLite3简介 SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置. ...

  3. IOS开发基础之SQLite3数据库的使用增删改查

    IOS开发基础之SQLite3数据库的使用增删改查 ios开发我们可能会使用到数据库进行持久化存储.sqlite3 是轻量级的数据库. 今天我们来介绍sqlite3 数据库.此方法跟java的增删改查 ...

  4. 华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“

    我们的生活态度就应该是 "不抱怨" ! 其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我 ...

  5. ios mysql 修改数据,iOS数据库FMDB--增删改查(模糊查询)实写记录

    在iOS中,主要有5种数据缓存的策略: 1.plist 2.归档 3.偏好设置 4.沙盒文件 5."SQLite数据库" 其中,"SQLite数据库" 是最常用 ...

  6. IOS sqlite数据库增删改查

    1.简介 简单封装sqlite数据库操作类 BaseDB 用于完成对sqlite的增删改查,使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h // ...

  7. ios 查询mysql数据库操作系统_iOS数据库FMDB--增删改查(模糊查询)详细介绍

    简介: 很早就想整理一下数据库的使用了,刚好最近接触较多,加之可以安排出空余的时间,所以瓜子我贡献出自己喝咖啡的时间整理一下FMDB的使用,以下是对FMDB的介绍以及基本使用 --- insert.d ...

  8. iOS CoreData (一) 增删改查

    代码地址如下: http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系 ...

  9. python对sqlite增删改查_Python操作sqlite3数据库 增删改查

    SQLite,是一款轻型的数据库,占用资源非常的低.这里记录下对sqlite3的增删改查相关操作,顺便复习一下SQL语句- -. 一.创建数据库 连接到一个现有的数据库.如果数据库不存在,那么它就会被 ...

最新文章

  1. web前端开发怎么学,web教程资源
  2. Java黑皮书课后题第5章:5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格
  3. 什么是PCM综合语音复用设备?
  4. Pycharm知识点
  5. AndroidStudio安卓原生开发_activity之间复杂对象类型的数据传递---Android原生开发工作笔记92
  6. java-redis字符类数据操作示例(一)
  7. [转载] 包含对象的json格式_如何把JSON数据格式转换为Python的类对象?
  8. WINDOWS上OpenCV需要有MediaPlayer才能正确运行?
  9. linux抓肉鸡入侵详细教程,一台linux肉鸡的简单手工入侵检测过程
  10. 豆瓣电影top250爬虫+数据可视化分析
  11. HIT CSAPP大作业--程序人生
  12. 罗振宇“时间的朋友”跨年演讲:为做事的人服务 准确抓住小趋势
  13. 【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索
  14. ESP32 天气预报 彩屏
  15. 金额换算(数字换汉字)
  16. fatal remote does not appear to be a git repository
  17. 有效解决package ‘xxxx‘ is not in GOROOT
  18. SCI SSCI CSSCI EI ISTP
  19. 模块化服务器供电系统,供电系统的模块化设计与模块化UPS详解.PDF
  20. RTC实时时钟(STM32)

热门文章

  1. maven工程插件配置
  2. hadoop程序MapReduce之SingletonTableJoin
  3. Web.Config文件配置之限制上传文件大小和时间
  4. PHP开发中,让var_dump调试函数输出更美观 ^_^#
  5. Eclipse插件的安装方法
  6. python利用wx.grid网格显示数据
  7. SharePoint【调试,诊错系列】-- 一种调试Sharepoint2010 Solution的快捷方式
  8. winsock select
  9. redis常用命令参考
  10. VC提前注入.net软件的方法