第四十二篇:IOS 的 sqlite3 一些基本使用

2024-05-12 20:08

本文主要是介绍第四十二篇:IOS 的 sqlite3 一些基本使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、sqlite3 使用操作

       前提:在项目中导入 libsqlite3.0.tdb 数据库。

1.sqlite3 相关一些基本函数用法:

1.1、打开数据库

SQLITE_API int sqlite3_open(constchar *filename,   /* Database filename (UTF-8) */sqlite3 **ppDb         /* OUT: SQLite db handle */
);

该函数传的两个参数如下使用,例:

static sqlite3 * db ;
NSString * dataBaseFile = [dataBaseHandledataBaseFile];
int result = sqlite3_open([dataBaseFileUTF8String], &db);
if (result == SQLITE_OK) //说明已经打开数据库;


1.2、当数据库被打开后执行创建数据库表:

SQLITE_API int sqlite3_exec(sqlite3*,                                 /* An open database */constchar *sql,                          /* SQL to be evaluated */int (*callback)(void*,int,char**,char**), /* Callback function */void *,                                   /* 1st argument to callback */char **errmsg                             /* Error msg written here */
);

// 创建数据库表语句 , primary key autoincrement修饰主键在表中值是唯一存在(最后一个单词自动增加)
// 条件:
// 1.表中必须要有一个主键;
// 2.在插入数据时主键自动增加使用 autoincrement修饰;
// 3.主键的值在表中是唯一的,如果插入的数据主键值一样则不能添加在表内
NSString * sqliteStr = @"create table if not exists StudentList(stu_number integer primary key autoincrement,stu_name text,stu_gender text,stu_age integer)";
// 执行语句
sqlite3_exec(db, [sqliteStrUTF8String], NULL,NULL, NULL);


1.3、关闭数据库

int result = sqlite3_close(db);
NSLog(@"%@",result ==SQLITE_OK ? @"关闭成功":@"关闭失败");


1.4、插入数据相关几个函数

1.4.1、验证数据库语句,nByte 传 -1 时自动计算 zSql 数据库语句长度

SQLITE_API int sqlite3_prepare_v2(sqlite3 *db,           /* Database handle */constchar *zSql,       /* SQL statement, UTF-8 encoded */int nByte,             /* Maximum length of zSql in bytes. */sqlite3_stmt **ppStmt, /* OUT: Statement handle */constchar **pzTail     /* OUT: Pointer to unused portion of zSql */
);

1.4.2、数据库管理指针 sqlite3_stmt 类型 

typedef structsqlite3_stmt  sqlite3_stmt;

1.4.3、绑定数据

// 第二个参数表示 数据库语句中的第 k 个 "?" ,从 k>=1 。
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,constchar*,int,void(*)(void*));
SQLITE_API int sqlite3_bind_int(sqlite3_stmt*,int, int);
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*,int, double);
...............

如 sql 语句:

@"select * from StudentList where stu_number = ? and stu_name = ?"
// 绑定参数据如下:
// 帮定参数,在之前先省去了一些步骤,稍后看例子。
sqlite3_bind_int(stmt, 1, (int)number);
sqlite3_bind_text(stmt, 2, [@"李四"UTF8String], -1,NULL);

1.4.4、执行数据库语句

SQLITE_API int sqlite3_step(sqlite3_stmt*);

1.4.5、释放数据库管理指针

SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);

插入数据示例:

// 插入数据
-(void)insertDataWithKeyValues:(StudentEntity *)entity
{// 1.打开数据库[self openDataBase];// 2.插入语句NSString * sqlStr = @"insert into StudentList(stu_name,stu_gender,stu_age,stu_number)values(?,?,?,?)";// 3.创建数据管理指针sqlite3_stmt * stmt = nil ;// 4.验证数据库语句,int result = sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"可以插入数据");// 5.帮定数据// 参数:数据库管理指针 , 在 sqlStr 的第n个 ?, 数据库语句 , 语句长度(-1表示自动计算长度) ,sqlite3_bind_text(stmt, 1, [entity.name UTF8String], -1, NULL);sqlite3_bind_text(stmt, 2, [entity.gender UTF8String], -1, NULL);sqlite3_bind_int(stmt, 3, (int)entity.age);sqlite3_bind_int(stmt, 4, (int)entity.number);// 6.让 sql 语句执行sqlite3_step(stmt);}// 7.释放sqlite3_finalize(stmt);// 8.关闭数据库[self closeDataBase];
}

1.5、从数据库中取出每条数据的每一列对应的数据

// iCol 表示每个字段所在的列位置,从 0 开始。
SQLITE_API double sqlite3_column_double(sqlite3_stmt*,int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*,int iCol);
SQLITE_API constunsigned char *sqlite3_column_text(sqlite3_stmt*,int iCol);
..................


1.6、数据库操作语句

       ListName 为创建的表名,one 、two 和 three 都是表中每一列的字段。

// 创建数据库表
@"create table if not exists ListName(one text primary key autoincrement , two text , three integer,......)";// 插入数据
@"insert into ListName(one , two , three,....) values(? , ? , ? , ....) ";// 查询
@"select * from ListName" // 查询表中所有数据
@"select * from ListName where one = ? " //带有一个条件的查询
@"select * from ListName where one = ? and two = ?" // 满足一个条件的查询
@"select * from ListName where one = ? or three = ?"  // 满足其中任意一个条件的查询
@"select * from ListName where three > ?" // 表中满足 three > 当前绑定的值 的 数据
@"select one,three from ListName where two = ? order by three disc(或是 asce)" // 查询表中满足(two = 当前绑定的值)条件的 one 和 three 值,并以 three 大小降序排列返回
@"select * from ListName where three > ? limit 5" // 满足条件的5条数据
@"select * from ListName where three > ? limit 3,5" // 跳过前三条数据 接着取后5条
@"select one,two from ListName where ...... "  //选出满足条件数据条的  one 和 two 值// 模糊查询所有字段 two 包含 likeName 内容的数据都找出来
[NSString stringWithFormat:@"select * from ListName where two  like '%%%@%%'",likeName];// 修改数据
@"update ListName set one = ? where three >= ?"// 删除数据
@"delete from ListName" // 删除表中所有数据
@"delete from ListName where one = ?" // 删除表中满足条件的数据// 删除整张表
@"drop table ListName"


2. 把 c 的字符串转换成 OC 中的 NSString 类型

[NSStringstringWithUTF8String:(char *)sqlite3_column_text(stmt,1)]


3.整个项目代码

3.1数据模型文件代码

//
//  StudentEntity.h
//  DataBaseDome
//
//  Created by 瞿杰 on 2017/6/19.
//  Copyright © 2017年 yiniu. All rights reserved.
//#import <Foundation/Foundation.h>@interface StudentEntity : NSObject@property(nonatomic,assign)NSInteger number;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *gender;
@property(nonatomic,assign)NSInteger age;@end
//
//  StudentEntity.m
//  DataBaseDome
//
//  Created by 瞿杰 on 2017/6/19.
//  Copyright © 2017年 yiniu. All rights reserved.
//#import "StudentEntity.h"@implementation StudentEntity@end

3.2 数据库操作文件

//
//  DataBaseHandle.h
//  DataBaseDome
//
//  Created by 瞿杰 on 2017/6/19.
//  Copyright © 2017年 yiniu. All rights reserved.
//#import <Foundation/Foundation.h>@class StudentEntity ;@interface DataBaseHandle : NSObject+(instancetype)dataBaseHandleWithDataBaseName:(NSString *)dataBaseName;// 打开数据库
-(void)openDataBase ;
// 关闭数据库
-(void)closeDataBase ;// 插入数据
-(void)insertDataWithKeyValues:(StudentEntity *)entity ;// 更新
-(void)updateStudentGender:(NSString *)gender byNumber:(NSInteger)number ;// 查询
// 查询所有数据
-(NSArray<StudentEntity *> *)selectAllKeyValues ;// 根据条件查询
-(StudentEntity *)selectOneStudentByNumber:(NSInteger)number ;// 模糊查询,只要包含 likeName 内容
-(StudentEntity *)selectOneStudentLikeName:(NSString *)likeName ;// 删除表中数据
-(void)deleteOneStudentByNumber:(NSInteger)number ;// 删除表
-(void)dropTable;@end
//
//  DataBaseHandle.m
//  DataBaseDome
//
//  Created by 瞿杰 on 2017/6/19.
//  Copyright © 2017年 yiniu. All rights reserved.
//#import "DataBaseHandle.h"#import "StudentEntity.h"
#import <sqlite3.h>@interface DataBaseHandle ()@property (nonatomic , copy)NSString * dataBaseName ;@end@implementation DataBaseHandlestatic sqlite3 * db ;+(instancetype)dataBaseHandleWithDataBaseName:(NSString *)dataBaseName
{DataBaseHandle * dataBaseHandle = [[self alloc] init];dataBaseHandle.dataBaseName = dataBaseName ;NSString * dataBaseFile = [dataBaseHandle dataBaseFile];// 打开数据库int result = sqlite3_open([dataBaseFile UTF8String], &db);if (result == SQLITE_OK) {// 创建数据库表语句 , primary key autoincrement 修饰主键在表中值是唯一存在(最后一个单词自动增加)// 条件:// 1.表中必须要有一个主键;// 2.在插入数据时主键自动增加使用 autoincrement 修饰;// 3.主键的值在表中是唯一的,如果插入的数据主键值一样则不能添加在表内NSString * sqliteStr = @"create table if not exists StudentList(stu_number integer primary key autoincrement,stu_name text,stu_gender text,stu_age integer)";// 执行语句sqlite3_exec(db, [sqliteStr UTF8String], NULL, NULL, NULL);}return dataBaseHandle ;
}// 数据库文件存放所在的 Caches 文件夹路径
-(NSString *)dataBasePath
{return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}// 数据库文件路径
-(NSString *)dataBaseFile
{return [[self dataBasePath] stringByAppendingPathComponent:[self.dataBaseName stringByAppendingString:@".db"]];
}// 打开数据库
-(void)openDataBase
{NSString * dataBaseFile = [self dataBaseFile];NSLog(@"%@",dataBaseFile);int result = sqlite3_open([dataBaseFile UTF8String], &db);if (result == SQLITE_OK) {NSLog(@"打开成功");}else{NSLog(@"打开失败");}
}// 关闭数据库
-(void)closeDataBase
{int result = sqlite3_close(db);NSLog(@"%@",result == SQLITE_OK ? @"关闭成功":@"关闭失败");
}// 插入数据
-(void)insertDataWithKeyValues:(StudentEntity *)entity
{// 1.打开数据库[self openDataBase];// 2.插入语句NSString * sqlStr = @"insert into StudentList(stu_name,stu_gender,stu_age,stu_number)values(?,?,?,?)";// 3.创建数据管理指针sqlite3_stmt * stmt = nil ;// 4.验证数据库语句,int result = sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"可以插入数据");// 5.帮定数据// 参数:数据库管理指针 , 在 sqlStr 的第n个 ?, 数据库语句 , 语句长度(-1表示自动计算长度) ,sqlite3_bind_text(stmt, 1, [entity.name UTF8String], -1, NULL);sqlite3_bind_text(stmt, 2, [entity.gender UTF8String], -1, NULL);sqlite3_bind_int(stmt, 3, (int)entity.age);sqlite3_bind_int(stmt, 4, (int)entity.number);// 6.让 sql 语句执行sqlite3_step(stmt);}// 7.释放sqlite3_finalize(stmt);// 8.关闭数据库[self closeDataBase];
}// 更新数据
-(void)updateStudentGender:(NSString *)gender byNumber:(NSInteger)number
{[self openDataBase];sqlite3_stmt * stmt = nil ;NSString * sql = @"update StudentList set stu_gender = ? where stu_number = ?";int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) { // 是否可以执行sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, NULL);sqlite3_bind_int(stmt, 2, (int)number);sqlite3_step(stmt);}sqlite3_finalize(stmt);[self closeDataBase];
}// 查询所有数据
-(NSArray<StudentEntity *> *)selectAllKeyValues
{// 1.打开数据库[self openDataBase];// 2.准备语句NSString * sql = @"select * from StudentList ";// 3.创建数据管理指针sqlite3_stmt * stmt = nil ;// 4.验证语句是否正确int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);NSMutableArray * mArr = [[NSMutableArray alloc] initWithCapacity:0];if (result == SQLITE_OK) {// 5.获取数据while (sqlite3_step(stmt) == SQLITE_ROW) {StudentEntity * entity = [[StudentEntity alloc] init];[mArr addObject:entity];entity.number = sqlite3_column_int(stmt, 0);entity.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];entity.gender = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];entity.age = sqlite3_column_int(stmt, 3);}}// 6.释放 和 关闭数据库sqlite3_finalize(stmt);[self closeDataBase];return mArr ;
}// 查询某一个满足条件的数据
-(StudentEntity *)selectOneStudentByNumber:(NSInteger)number
{[self openDataBase];// 数据库语句:* 表示每条数据的所有字段;? 表示需要帮定的值NSString * sql = @"select * from StudentList where stu_number = ?";// 多条件查询如:@"select * from StudentList where stu_number = ? and stu_name = ?"// @"select * from StudentList where stu_number = ? or stu_name"// @"select * from StudentList where stu_number > ?"// @"select * from StudentList where stu_number > ? limit 5" 满足条件的5条数据// @"select * from StudentList where stu_number > ? limit 3,5" 跳过前三条数据 接着取后5条// @"select * from StudentList where stu_number > ?  order by stu_age disc " 在数据库中的数据满足条件 stu_number > ?(帮定的值) 选出的个数,然后以 stu_age 列把数据降序排列// @"select stu_name,stu_age from StudentList where ...... " 选出满足条件数据条的 stu_name 和 stu_age 值// 创建数据管理指针sqlite3_stmt * stmt = nil ;StudentEntity * entity = [[StudentEntity alloc] init];// 验证语句是否正确int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) {// 帮定参数sqlite3_bind_int(stmt, 1, (int)number);sqlite3_bind_text(stmt, 2, [@"李四" UTF8String], -1, NULL);while (sqlite3_step(stmt) == SQLITE_ROW) {entity.number = sqlite3_column_int(stmt, 0);entity.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];entity.gender = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];entity.age = sqlite3_column_int(stmt, 3);}}sqlite3_finalize(stmt);[self closeDataBase];return entity ;
}// 模糊查询
-(StudentEntity *)selectOneStudentLikeName:(NSString *)likeName
{[self openDataBase];sqlite3_stmt * stmt = nil ;StudentEntity * entit = [[StudentEntity alloc] init] ;NSString * sql = [NSString stringWithFormat:@"select * from StudentList where stu_name like '%%%@%%'",likeName];int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"可以模糊查询");//        sqlite3_bind_text(stmt, 1, [likeName UTF8String], -1, NULL);while (sqlite3_step(stmt) == SQLITE_ROW) {entit.number = sqlite3_column_int(stmt, 0);entit.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];entit.gender = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];entit.age = sqlite3_column_int(stmt, 3);}}sqlite3_finalize(stmt);[self closeDataBase];return entit ;
}// 删除表中的数据
-(void)deleteOneStudentByNumber:(NSInteger)number
{[self openDataBase];NSString * sql = @"delete from StudentList where stu_number = ?";sqlite3_stmt * stmt = nil ;int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) {sqlite3_bind_int(stmt, 1, (int)number);// 执行语句sqlite3_step(stmt);}sqlite3_finalize(stmt);[self closeDataBase];
}// 删除整个表
-(void)dropTable
{[self openDataBase];NSString * sql = @"drop table StudentList";sqlite3_stmt * stmt = nil ;int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"成功删除当前表");sqlite3_step(stmt);}sqlite3_finalize(stmt);[self closeDataBase];
}@end



3.3 使用数据库操作的测试代码

//
//  ViewController.h
//  DataBaseDome
//
//  Created by 瞿杰 on 2017/6/19.
//  Copyright © 2017年 yiniu. All rights reserved.
//#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end


//
//  ViewController.m
//  DataBaseDome
//
//  Created by 瞿杰 on 2017/6/19.
//  Copyright © 2017年 yiniu. All rights reserved.
//#import "ViewController.h"#import "DataBaseHandle.h"
#import "StudentEntity.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];DataBaseHandle * dataBaseHandle = [DataBaseHandle dataBaseHandleWithDataBaseName:@"StudentDB"];// 查询所有缓存的数据NSArray * allStudents = [dataBaseHandle selectAllKeyValues];// 1.插入数据StudentEntity * entity = [[StudentEntity alloc] init];entity.number = 1000 ;entity.name = @"张三";entity.gender = @"男";entity.age = 20 ;StudentEntity * entity2 = [[StudentEntity alloc] init];entity2.number = 1001 ;entity2.name = @"李四";entity2.gender = @"女";entity2.age = 25 ;[dataBaseHandle insertDataWithKeyValues:entity];[dataBaseHandle insertDataWithKeyValues:entity2];// 2.查询所有数据allStudents = [dataBaseHandle selectAllKeyValues];// 查询单个数据StudentEntity * selectStudent = [dataBaseHandle selectOneStudentByNumber:1000];StudentEntity * selectStudent2 = [dataBaseHandle selectOneStudentByNumber:1001];// 3.更新数据[dataBaseHandle updateStudentGender:@"女" byNumber:1000];[dataBaseHandle updateStudentGender:@"男" byNumber:1001];// 查询所有数据allStudents = [dataBaseHandle selectAllKeyValues];[dataBaseHandle deleteOneStudentByNumber:1001];// 查询所有数据allStudents = [dataBaseHandle selectAllKeyValues];// 查询单个数据selectStudent = [dataBaseHandle selectOneStudentByNumber:1000];selectStudent2 = [dataBaseHandle selectOneStudentByNumber:1001];// 删除整张表[dataBaseHandle dropTable];// 查询所有数据allStudents = [dataBaseHandle selectAllKeyValues];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end




4. 在 git 上的代码仓库DataBaseDome






这篇关于第四十二篇:IOS 的 sqlite3 一些基本使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983619

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

sqlite3 命令行工具使用指南

《sqlite3命令行工具使用指南》本文系统介绍sqlite3CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语... 目录一、启动与退出二、数据库与文件操作三、元数据查询四、数据操作与导入导出五、查询输出格式化六、实用功

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图