//使用SQL 需要先引入 sqlite3.h 头文件 7.0之前的版本和之后的版本引入的文件 后缀名不一样 7.0版本是libsqlite3.0.tbd 之前的版本都是libsqlite3.0.dylib
#import <sqlite3.h>
#import <Foundation/Foundation.h>@interface SQLiteManager : NSObject
//使用SQLite数据库步骤
//1.引入 sqlite3.0框架
//2.在数据库操作类里 引入<sqlite3.h>头文件
//注意:咱们使用的函数都在这个头文件中
//创建一个单例类 使用SQl语句
//
+ (SQLiteManager *)shareManager{
//静态区指针
static SQLiteManager *manager = nil;
if (manager == nil) {
manager = [[SQLiteManager alloc]init];
//调用创建表的方法
[manager createTable];
}
//不需要手动释放 程序运行结束 自动释放
return manager;
}
//需要在静态区定义一个指针指向数据库(让这个指针指向的对象 从程序开始到结束一直存在 程序结束后 被系统自动释放)
//手敲 sqlite 的时候 一开始不出提示 多来两次 就可以了
//创建一个空的sql指针
static sqlite3 *db = nil;
//打开数据库
- (sqlite3 *)openDB{
//判断数据库 是否存在 如果存在直接返回
//不存在 则创建 并打开
if (db != nil) {
return db;
}else{
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//拼接数据库文件路径(拼接的数据库文件的名字)
NSString *dbPath = [documentPath stringByAppendingPathComponent:@"/Students.sqlite"];
NSLog(@"%@",dbPath);
//创建 或者 打开 数据库
//<#const void *filename#> 参数1 文件的路径(需要把OC的字符串 转化成C语言的)
// dbPath.UTF8String 把OC的 转化成 C语言的
//<#sqlite3 **ppDb#> 参数2 数据库的地址
//接收一下返回值 判断 是否打开成功
int result = sqlite3_open(dbPath.UTF8String,&db);
//可以查表得到错误
if (result == SQLITE_OK) {
NSLog(@"OK");
} else {
NSLog(@"打开失败");
NSLog(@"%d",result);
}
}
return db;
}
//关闭数据库
- (void)closeDB{
int result = sqlite3_close(db);
//判断是否关闭成功
if (result == SQLITE_OK) {
NSLog(@"关闭成功");
//把数据库 的指针 重置为空
db = nil;
} else {
NSLog(@"关闭失败");
}
}
//创建一张表
- (void)createTable{
//注意:一定要在操作时 先打开数据库
// 操作完毕 关闭数据库
//打开数据库
db = [self openDB];
//1 写 sql 语句
NSString *sql = @"create table if not exists student(number integer primary key not null,name text not null,sex text not null,age integer not null,imagedata blob not null)";
//2 执行sql语句
// 准备与 执行 语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL) ;
if (result == SQLITE_OK) {
NSLog(@"创建表成功");
} else {
NSLog(@"建表失败");
NSLog(@"%d",result);
}
[self closeDB];
}
//关闭数据库
//插入数据
- (void)inserttableWithStudent:(Student *)student{
//打开数据库
db = [self openDB];
// 写语句
NSString *sql = @"insert into student(number, name, sex, age, imageData) values(?,?,?,?,?)";
// 创建一个跟随指针 (指令集)
sqlite3_stmt *stmt = nil;
// 执行sql语句
// 预执行 需要用跟随指针 绑定 问号
// 然后一步 一步 执行(可以判断sql 语句 是否正确)
int resulet = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (resulet == SQLITE_OK) {
NSLog(@"成功插入");
// 绑定问号(根据sql语句 决定绑定的顺序)
// 注意绑定的顺序从 1 开始
// 参数2 绑定顺序
// 参数3 要插入的值
// (int)student.imageData.length 相当于获取到data数据的长度
sqlite3_bind_int(stmt, 1, (int)student.number);
sqlite3_bind_text(stmt, 2, student.name.UTF8String, -1, NULL);
sqlite3_bind_text(stmt, 3, student.sex.UTF8String, -1, NULL);
sqlite3_bind_int(stmt, 4, (int)student.age);
sqlite3_bind_blob(stmt, 5, student.imageData.bytes, (int)student.imageData.length, NULL);
// 执行绑定的语句
sqlite3_step(stmt);
} else {
NSLog(@"插入失败");
NSLog(@"%d",resulet);
}
// 不管插入是否成功 都要释放跟随指针 防止内存泄露
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDB];
/*
如果有data数据 进行插入 这个函数会把data数据转化成字符串 存入数据库
如果你插入的数据没有data数据 是可以直接用 sqlite3_exec 插入数据就行 不用绑定
NSString *sql = @"insert into student(number, name, sex, age, imageData) values('%ld','%@','%@','%ld',)";
*/
}
//- (void)text:(Student *)stu{
// NSString *sql = @"insert into student(number, name, sex, age, imageData) values('%ld','%@','%@','%ld',)";
// NSString *sqlNew = [NSString stringWithFormat:@"insert into student(number, name, sex, age) values('%ld','%@','%@','%ld',)",stu.number,stu.name,stu.sex,stu.age];
//}
// 删除数据 根据一个条件删除
- (void)deleteWithAge:(NSInteger)age{
// 打开数据库
[self openDB];
#pragma -- mark 不绑定删除 需要拼接sql语句
// 写语句
// NSString *sql = @"delete from student where age > '%ld'";
// NSString *sqlNew = [NSString stringWithFormat:@"delete from student where age > '%ld'",age];
执行sql语句
// int result = sqlite3_exec(db, sqlNew.UTF8String, NULL, NULL, NULL);
// if (result == SQLITE_OK) {
// NSLog(@"删除成功");
// } else {
// NSLog(@"删除失败");
// NSLog(@"%d",result);
// }
// //关闭数据库
// [self closeDB];
#pragma -- mark 绑定删除
// 打开数据库
db = [self openDB];
// 写sql语句
NSString *sql = @"delete from student where age > ?";
// 创建跟随指针
sqlite3_stmt *stmt = nil;
//预执行语句
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"成功");
// 绑定问号
sqlite3_bind_int(stmt, 1, (int)age);
sqlite3_step(stmt);
} else {
NSLog(@"失败");
NSLog(@"%d",result);
}
//不管成功与否 都要 释放跟随指针
sqlite3_finalize(stmt);
//关闭数据库
[self closeDB];
}
// 更新数据(根据一个条件来更新)
- (void)updateAge:(NSInteger)age byName:(NSString *)name{
//打开数据库
db = [self openDB];
//写语句
NSString *sql = [NSString stringWithFormat:@"update Student set age = '%ld' where name = '%@'",age,name];
//执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"成功");
} else {
NSLog(@"失败");
}
[self closeDB];
}
// 查询语句(根据条件查询)
//5.查询语句
//where 根据条件查询 多条件用 and 连接
//*表示 查询所有字段
//
//select * from Student where name = ? and age = ?
//
//select * from Student 查询所有
//
//
//select name,imageData from Student where name = ? and age = ?
//select name,imageData 只查询这两个字段
- (LanOuStudent *)selecteStudentWithName:(NSString *)name age:(NSInteger)age{
// 打开数据库
db = [self openDB];
// 写sql语句
NSString *sql = @"select * from Student where name = ? and age = ?";
//创建跟随指针
sqlite3_stmt *stmt = nil;
//创建一个对象
Student *stu = [[Student alloc]init];
//预执行
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"成功");
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
sqlite3_bind_int(stmt, 2, (int)age);
//执行语句
// sqlite3_step(stmt);
//查询时
//如果下一行 准备好了 返回SQLITE_ROW
//这是可以继续查询
while (sqlite3_step(stmt) == SQLITE_ROW) {
//读取数据
//<#int iCol#> 列数
//如果 你查询所有字段的话 那么这个列数 就跟你创建表的顺序一样
//注意 从0 开始
//如果你查询的时特定的字段 那么这个列数 就要根据你的sql来写 也是从0开始
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *sex = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
//赋值model
//把C语言字符串 转化成OC字符串
stu.name = [NSString stringWithUTF8String:name];
stu.age = age;
stu.number = number;
stu.sex = [NSString stringWithUTF8String:sex];
stu.imageData = imageData;
}
} else {
NSLog(@"失败");
NSLog(@"%d",result);
}
//释放stmt
sqlite3_finalize(stmt);
//关闭数据库
[self closeDB];
return [stu autorelease];
}
// 查询所有(返回一个数组)
// selecte *from student
- (NSArray *)selecteAllStudent{
// 打开数据库
db = [self openDB];
// 写sql语句
NSString *sql = @"selecte *from student";
// 创建一个可变数组备用
NSMutableArray *array = [NSMutableArray array];
// 创建跟随指针
sqlite3_stmt *stmt = nil;
// 预执行
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"成功");
while (sqlite3_step(stmt) == SQLITE_ROW) {
//读取数据
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *sex = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
Student *stu = [[Student alloc]init];
//赋值model
stu.name = [NSString stringWithUTF8String:name];
stu.age = age;
stu.number = number;
stu.sex = [NSString stringWithUTF8String:sex];
stu.imageData = imageData;
//添加到数组
[array addObject:stu];
}
} else {
NSLog(@"失败");
}
//释放指针
sqlite3_finalize(stmt);
[self closeDB];
return array ;
}