#import "SQliteManager.h"
@implementation SQliteManager
// 初始化方法
// 创建单例类 进行对数据库操作方法的封装
+ (SQliteManager *)shareManager
{
// 静态区 搞个指针
static SQliteManager *manager = nil;
if (manager == nil) {
manager = [[SQliteManager alloc] init];
}
return manager;
}
// 定义一个静态指针负责连接数据库
// 保证数据库一直到程序结束才被释放
static sqlite3 *db = nil;
#pragma mark - 打开数据库
// sqlite3 * 表示咱们的数据库
- (sqlite3 *)openDB
{
// 判断
// 如果数据库不为空, 就说明数据库存在, 直接返回就行
if (db != nil) {
return db;
}
// 不存在 就创建一个
// 获取路径
NSArray *documentArrar = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documentArrar lastObject];
// 拼接路径
// Student.sqlite 数据库的名称 (数据库的后缀为.sqlite)
NSString *dbPath = [documentPath stringByAppendingPathComponent:@"Student.sqlite"];
// 创建数据库
// 参数1 <#const char *filename#> 要的是文件路径, 需要把OC字符串转化一下类型 dbPath.UTF8String
// 参数2 <#sqlite3 **ppDb#> 数据库地址
// sqlite3_open() 该函数表示如果有数据库存在就打开, 没有就创建出来一个
int result = sqlite3_open(dbPath.UTF8String, &db);
// 查看命令返回结果
// SQLITE_OK 返回结果成功
if (result == SQLITE_OK) {
NSLog(@"打开成功 或者 创建成功");
} else {
NSLog(@"打开失败 或者 创建失败");
}
NSLog(@"数据库路径: %@", dbPath);
// 创建成功或者打开成功就返回数据库
return db;
}
#pragma mark - 关闭数据库
// 关闭不需要返回值
- (void)closeDB
{
// 关闭数据库函数
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
NSLog(@"关闭数据库成功");
// 如果成功 把数据库重置为空
db = nil; // (置空目的 为了保证开启数据库是都走创建的哪个函数)
} else {
NSLog(@"关闭数据库失败");
}
}
#pragma mark - 创建一个表
- (void)createTable
{
// 创建表步骤
// 1. 打开数据库
// 2. 写创建表的sql语句
// 3. 执行这条sql语句
// 4. 判断返回值 (是否成功)
// 5. 关闭数据库
// 1. 打开数据库
db = [self openDB];
// 2. 写创建表的sql语句
NSString *sql = @"create table IF NOT EXISTS lanOuStudent(number integer primary key not NULL, name text not NULL, gender text not NULL, age integer not NULL)";
// 3. 执行这条sql语句
// <#char **errmsg#> 错误信息
char *error = nil; // char C语言的
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, &error);
// 4. 判断返回值 (是否成功)
if (result == SQLITE_OK) {
NSLog(@"创建表成功---");
} else {
NSLog(@"创建表失败---");
}
// 5. 关闭数据库
[self closeDB];
}
#pragma mark - 插入数据
// 出入的不是model 而是model的信息
- (void)insertWithStudent:(LanOuStudent *)student
{
// 插入的步骤
// 1. 打开数据库
// 2. 写sql语句
// 3. 执行sql语句
// 4. 判断是否插入成功
// 5. 关闭数据库
// 1. 打开数据库
db = [self openDB];
// 2. 写sql语句
NSString *sql = [NSString stringWithFormat:@"insert into lanOuStudent(name, gender, age, number) values ('%@', '%@', '%ld', '%ld')", student.name, student.gender, student.age, student.number];
// 3. 执行sql语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
// 4. 判断是否插入成功
if (result == SQLITE_OK) {
NSLog(@"插入 成功 !!!!!");
} else {
NSLog(@"插入 失败 !!!!!");
}
// 5. 关闭数据库
[self closeDB];
}
@end