#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