#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface DataBaseHandler : NSObject
{
// 添加一个成员变量 作用:指向本地的数据库文件,方便我们进行读写操作
sqlite3 *dbPoint;
}
// 把这个数据库处理类 写成一个单例
// 单例方法的写法: 单例永远不会被释放 不可被改变
// 1. 类方法(+)
+(DataBaseHandler *)shareInstance;
// 数据库的一些相关方法声明
//打开数据库
- (void)openDB;
// 关闭数据库
- (void)closeDB;
// 创建表
- (void)createTable;
//insert
-(void)insertStudent:(Student *)student;
- (NSMutableArray *)selectAll;
@end
#import "DataBaseHandler.h"
@implementation DataBaseHandler
// 类方法的实现
+ (DataBaseHandler *)shareInstance
{
//创建一个静态指针, 只走一次这行代码
static DataBaseHandler *dataBase = nil;
if(dataBase == nil) {
// 如果指针为空, 说明这是第一次执行
dataBase = [[DataBaseHandler alloc] init];
}
return dataBase;
}
- (void)openDB
{
// 打开数据库
// 相关函数
// 获取沙盒中documents文件夹
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接一个数据库文件路径
NSString *dbPath = [docPath stringByAppendingPathComponent:@"suibian.db"];
NSLog(@"%@", dbPath);
// 参数1: 数据库文件路径[dbPath UTF8String] 将oc字符串转为c的字符串;
// 参数2: 数据库的指针地址
// 作用: 1.去找文件路径下有没有相应的文件
// 2. 如果没有,创建一个数据库文件,打开
// 3. 如果有打开
int result = sqlite3_open([dbPath UTF8String], &dbPoint);
NSLog(@"结果: %d", result);
}
- (void)closeDB
{
// 关闭数据库
sqlite3_close(dbPoint);
}
- (void)createTable
{
// 创建一个表
// 执行sql语句的函数
// 参数1:数据库指针
// 参数2:sql语句
// 参数3: 回调函数
NSString *sql = @"create table student (name text,number integer primary key, sex text)";
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
NSLog(@"结果: %d", result);
}
- (void)insertStudent:(Student *)student
{
NSString *sql = [NSString stringWithFormat:@"insert into student values ('%@', %d, '%@')", student.name, student.number, student.sex];
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
NSLog(@"%d", result);
}
-(NSMutableArray *)selectAll
{
// 搜索所有学生
NSMutableArray *allStu = [NSMutableArray array];
NSString *sql = @"select * from student";
// 1.设置一个数据库替身 也就是一个临时数据库 作用: 你对数据库的所有操作都暂时保存到替身中, 确认无误后,系统自动写到本地数据库
sqlite3_stmt *stmt = nil;
// 2.确认sql语句的重要性
// 参数1: 数据库指针
// 参数2: SQL语句
// 参数3: 控制sql的长度(-1:不控制长度)
// 参数4: 替身
// 作用: 1.检查sql语句的正却行
// 2.指定stmt为数据库的替身
int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);
if(result == 0) {
// sql确认无误,执行sql语句
while (sqlite3_step(stmt) == 0) {
// 如果数据库中有符合搜索条件的一行, 就进入while循环体
// 按照列, 取得相应的值
// 获取第一列的值
// 参数1: 替身
// 参数2: 第几列
const unsigned char* nameChar = sqlite3_column_text(stmt, 0);
NSString *name = [NSString stringWithUTF8String:(const char*)nameChar];
//获取第二列的值
int number = sqlite3_column_int(stmt, 1);
// 获取第三列的值
NSString *sex = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)];
Student *stu = [[Student alloc] init];
stu.name = name;
stu.number = number;
stu.sex = sex;
[allStu addObject:stu];
[stu release];
}
}
// 将替身中的所有数据操作都写到本地数据库, 销毁替身;
sqlite3_finalize(stmt);
return allStu;
}
@end