1. SQLite数据库的特点:
- SQLite是一款轻量级的嵌入式数据库(用于移动端)
- 处理数据的速度, 比MySQL还要快
- SQLite不需要进行配置(只需要引入依赖库, 和头文件),这就意味着不需要安装
- SQLite的一个不需要单独服务器进行(维护)操作的系统, 是完全自己独立
- SQLite是非常小的, 完全配置时小于400K, 当省略一些可选文件时小于250K
- SQLite是自给自足的, 也就意味着不需要任何的外部依赖
2. SQLite数据库的基本操作
打开数据库格式 : sqlite3_open(数据库路径.UTF8String, 指向数据库的地址的地址);
创建表格式: create table 表名 ( 字段名1 字段类型 约束1 约束2 ,字段2 约束2);
插入数据(增)格式: insert into 表名(name,age) values(‘大王',10);
删除数据(删)格式: delete from 表名 where 条件
修改数据(改)格式: update 表名 set 字段名 = 值 where 条件字段 = 满足条件//修改的不仅仅是一条记录
查询数据(查)格式: select 字段* from 表名 where 条件
关闭数据库格式: sqlite3_close(数据库指针);
3. SQLite的具体实例应用
文件结构
- 单例类(DataBaseHandle)(工具类, 所有sqlite语句都封装到该类中, 在controller中用该类的对象调用数据库的基本操作(方法))
- controller类(ViewConteoller)(类中调用单例类, 并初始化一个单例类对象, 调用数据库操作方法)
文件内容
DataBaseHandle.h文件
#import
//第一步: 导入依赖库
//第二步: 引入头文件
#import
@interface DBHandle : NSObject
//初始化单例类对象的方法
+ (DBHandle*)shareDBHandle;
//打开数据库方法
- (void)openDB;
//关闭数据库方法
- (void)closeDB;
//建表
- (void)setCreate;
//增加记录(此处以姓名,年龄)
- (void)insertWithName:(NSString *)name age:(NSInteger)age;
//删除记录(SID)
- (void)deleteStudentByID:(NSInteger)SID;
//更新数据(根据字段age)
- (void)updateWithAge:(NSInteger)age;
//查找数据(根据字典name)
- (void)selectWithName:(NSString *)name;
//删除表
- (void)clearDB;
@end
DataBaseHandle.m文件
#import "DBHandle.h"
//创建代理对象
static DBHandle *dataBase = nil;
@interface DBHandle ()
//保存数据库路径
@property (nonatomic, copy)NSString *dataBasePath;
@end
@implementation DBHandle
实现数据库操作的方法
//初始化单例类对象的房
+ (DBHandle *)shareDBHandle{
if (dataBase == nil) {
dataBase = [[DBHandle alloc] init];
}
return dataBase;
}
*返回数据库文件路径
- (NSString *)dataBasePath{
if (_dataBasePath == nil) {
//1. 获取数据库路径
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
//2. 拼接数据库文件
_dataBasePath = [documents stringByAppendingString:@"/student.sqlite"];
}
return _dataBasePath;
}
*数据库指针
//数据库指针: 因为好多地方都会使用到数据库, 所以初始化一个数据库静态变量
//创建数据库指针
static sqlite3 *db = nil;
*打开数据库方法
//打开数据库方法
- (void)openDB{
NSLog(@"databasePath = %@", self.dataBasePath);
//定义一个BooL类型的数据, 用来接收打开数据库的结果
//参数一: 数据库存储的路径 (c语言形式.UTF8String)
//参数二: 数据库的地址 &
BOOL result = sqlite3_open(self.dataBasePath.UTF8String, &db);
if (result == SQLITE_OK) {
NSLog(@"打开成功");
}else{
NSLog(@"打开失败");
}
}
* 关闭数据库方法
//关闭数据库方法
- (void)closeDB{
BOOL result = sqlite3_close(db);
if (result == SQLITE_OK) {
NSLog(@"关闭成功");
}else{
NSLog(@"关闭失败");
}
}
*建表
//建表
- (void)setCreate{
//1. 准备SQL语句 , 创建一个Stu表
NSString *sqlString = @"create table if not exists stu(s_id integer primary key autoincrement not null, s_name text, s_age integer)";
//2. 执行SQL语句
//参数一: 数据库
//参数二: 要执行的sql语句(要求转换成C语言的格式)
//参数三: 表示结果回调一个函数
//参数四: 回调一个函数参数
//参数五: 错误信息
int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"创建表成功");
}else{
NSLog(@"创建表失败%d", result);
}
}
* 增加记录(此处以姓名,年龄)
//增加记录(此处以姓名,年龄)
- (void)insertWithName:(NSString *)name age:(NSInteger)age{
//1. 准备SQL语句(当values的值不确定的时候,需要使用"?"来代替, 之后需要对其进行绑定)
NSString *SQLString = @"insert into stu(s_name, s_age) values(?,?)";
//2. 创建伴随指针(用于绑定参数, 获取数据)
sqlite3_stmt *stmt = NULL;
//3. 预执行
//参数一: 数据库
//参数二: sql语句(C语言的格式, 所以需要进行转码:UTF8String)
//参数三: 有正负之分(正: 代表只往后读一个字节. 负: 遇到特殊符号才会结束,例如:\000, u000) s_name = @"zhang\000san"
//参数四: 伴随指针的地址
//参数五: 表示取值的时候只取一部分, 剩余的部分会存储在这里
int result = sqlite3_prepare(db, SQLString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"添加预处理成功");
//4. 绑定参数
//参数一: 伴随指针 -->用于绑定参数,获取数值
//参数二: 绑定参数位置( "?" 的位置, 从1开始)
//参数三: 表示要插入的值(形参),需要进行UTF8String转换
//参数四: 有正负之分(正: 代表只往后读一个字节. 负: 遇到特殊符号才会结束,例如:\000, u000) s_name = @"zhang\000san"
//参数五: 回调一个函数
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); //对Name进行绑定
sqlite3_bind_int64(stmt, 2, age);
//5. 执行伴随指针(sql语句执行完毕后, 根据伴随指针的情况判断是否插入成功(SQLITE_DONE: 表示伴随指针执行数据成功))
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"插入成功");
}else{
NSLog(@"插入失败%d", result);
}
}else{
NSLog(@"添加预处理失败%d", result);
}
//6. 释放伴随指针
sqlite3_finalize(stmt);
//第二种方式:
//NSString *SQLString = [NSString stringWithFormat:@"insert into stu(s_name, s_age) values('%@', %ld)",name, age];
//int result = sqlite3_exec(db, SQLString.UTF8String, NULL, NULL, NULL);
}
* 删除记录(SID)
//删除记录(SID)
- (void)deleteStudentByID:(NSInteger)SID{
//1. 准备SQL语句
NSString *sqlString = [NSString stringWithFormat:@"delete from stu where s_id = %ld",SID];
//2. 执行sql语句
int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
//3. 结果
if (result == SQLITE_OK) {
NSLog(@"删除数据成功%ld", SID);
}else{
NSLog(@"删除失败%d", result);
}
}
*更新数据(根据字段age)
//更新数据(根据字段age)
- (void)updateWithAge:(NSInteger)age{
//1. 准备SQL语句(无条件时, 不做更新)
NSString *sqlString = @"update stu set s_age = ? where s_age = 18";
//2. 创建伴随指针
sqlite3_stmt *stmt = NULL;
//3. 预执行
int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"预处理成功");
//4. 绑定参数
sqlite3_bind_int64(stmt, 1, age);
//5. 执行判断伴随指针是否绑定成功
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"更新成功");
}else{
NSLog(@"更新失败");
}
}else{
NSLog(@"语句错误");
}
//6. 释放伴随指针
sqlite3_finalize(stmt);
//第二种方法:
//NSString *sqlString = [NSString stringWithFormat:@"update stu set s_age = %ld where s_age = 20", age];
//int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
}
*查找数据(根据字典name)
//查找数据(根据字典name)
- (void)selectWithName:(NSString *)name{
//1. 准备sql语句
//NSString *sqlString = @"select * from stu where s_name = ?";
NSString *sqlString = [NSString stringWithFormat:@"select * from stu where s_name = '%@'", name]; //添加 单引号
//2. 创建伴随指针
sqlite3_stmt *stmt = nil;
//3. 预执行
int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
//4. 绑定数据
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
while (sqlite3_step(stmt) == SQLITE_ROW) {
//从伴随指针获取数据(第一列)
int s_id = sqlite3_column_int(stmt, 0);
//从伴随指针获取数据(第二列)
NSString *s_name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
//从伴随指针获取数据(第三列)
int s_age = sqlite3_column_int(stmt, 2);
NSLog(@"s_id = %d, s_name = %@, s_age = %d", s_id, s_name, s_age);
}
}else{
NSLog(@"查找失败%d", result);
}
//释放伴随指针
sqlite3_finalize(stmt);
}
* 清除表内容 和删除数据库表
//清除表内容 和删除数据库表
- (void)clearDB{
//1. 准备sql 语句
NSString *sql = @"delete from stu";
//删除表
//NSString *sql = @"drop table stu";
//2. 执行
sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
}
@end
viewController.m文件
#import "DBHandle.h"
DBHandle *db = [DBHandle shareDBHandle];
//打开数据库
[db openDB];
//建表
[db setCreate];
//插入
[db insertWithName:@"帅哥" age:20];
//删除
//[db deleteStudentByID:1];
//更新
[db updateWithAge:10];
[db selectWithName:@"美女007"];
[db clearDB];
//关闭数据库
[db closeDB];