#import <Foundation/Foundation.h> #import <sqlite3.h> #import "LanOuStudent.h" @interface SQLiteManager : NSObject // 创建单例类 进行对数据库操作方法的封装 + (SQLiteManager *)shareManager; // 如果你要使用数据库的话 要引入一个框架 libsqllite3.0.dylib 框架 // 使用的话需要引入头文件 // 打开数据库 sqlite3 *表示数据库 返回打开的数据库 - (sqlite3 *)openDB; // 关闭数据库 - (void)closeDB; // 创建一个表 - (void)createTable; // 插入数据 // 插入的不是model而是model的值 - (void)insertWith:(LanOuStudent *)student; // 删除数据 - (void)deleteStudentWithAge:(NSInteger)age; //更新数据 根据名字修改年龄 - (void)updateStudentName:(NSString *)name setAge:(NSInteger)age; - (LanOuStudent *)queryStudentWithName:(NSString *)name andAge:(NSInteger)age; // 查询所有的学生信息 - (NSArray *)queryAllStudents; @end
</pre><pre name="code" class="objc"><pre name="code" class="objc">
#import "SQLiteManager.h" @implementation SQLiteManager // 初始化方法 + (SQLiteManager *)shareManager { static SQLiteManager *manager = nil; if (manager == nil) { manager = [[SQLiteManager alloc] init]; } return manager; } // 定义一个静态指针 负责连接数据库 // 保证数据库直到程序结束才会释放 static sqlite3 *db = nil; // 打开数据库 sqlite3 *表示数据库 返回打开的数据库 - (sqlite3 *)openDB { // 判断 // 如果数据库不为空 就说明数据库存在 直接返回 if (db != nil) { return db; } //不存在就创建一个 // 获取文件路径 NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject; // 拼接路径 // 数据库的名称 Student.sqlite NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"]; // 创建数据库 // 参数1 文件的路径 需要将OC的字符串 转化一下类型 dbPath.UTF8String // 参数2 数据库的地址 // sqlite3_open()该函数 如果存在数据库就打开没有就创建 int result = sqlite3_open(dbPath.UTF8String, &db); // 查看命令返回结果 //SQLITE_OK 表示成功 if (result == SQLITE_OK) { NSLog(@"创建成功"); NSLog(@"%@", dbPath); } else { NSLog(@"创建失败 或者 打开失败"); } return db; } // 关闭数据库 - (void)closeDB { // 关闭数据库 int result = sqlite3_close(db); if (result == SQLITE_OK) { // 如果成功了把数据库置空 db = nil; NSLog(@"关闭成功"); } else { NSLog(@"关闭数据库失败"); } } // 创建一个表 - (void)createTable { // 1、打开数据库 db = [self openDB]; // 2、写创建表的SQL语句 NSString *sql = @"create table if not exists lanOuStudent(number integer primary key not NULL, name text nut NULL, age integer not NULL, gender text not NULL)"; // 3、执行这个语句 //char **errmsg 错误信息 char *error = nil; int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, &error); // 4、判断是否成功 if (result == SQLITE_OK) { NSLog(@"创建表成功"); } else { NSLog(@"创建失败"); } // 5、关闭数据库 [self closeDB]; } // 插入数据 // 插入的不是model而是model的值 - (void)insertWith:(LanOuStudent *)student { //1、打开数据库 db = [self openDB]; //2、写SQL语句 NSString *sql =[NSString stringWithFormat:@"insert into lanOuStudent(name, age, gender, number) values('%@', '%ld', '%@', '%ld')", student.name, student.age, student.gender, 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]; } // 删除数据 - (void)deleteStudentWithAge:(NSInteger)age { //1、打开数据库 db = [self openDB]; // 2、写sql语句 NSString *sql = [NSString stringWithFormat:@"delete from lanOuStudent where age > '%ld'", age]; // 3、执行语句 int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil); //4、判断是否成功 if (result == SQLITE_OK) { NSLog(@"删除成功"); } else { NSLog(@"删除失败"); } // 关闭数据库 [self closeDB]; } //更新数据 根据名字修改年龄 - (void)updateStudentName:(NSString *)name setAge:(NSInteger)age { // 1、打开数据库 db = [self openDB]; //2、写sql语句 NSString *sql = [NSString stringWithFormat:@"update lanOuStudent set age = '%ld' where name = '%@'", age, name]; //3、执行sql语句 int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil); //4、判断是否执行成功 if (result == SQLITE_OK) { NSLog(@"更新成功"); } else { NSLog(@"更新失败"); } // 5、关闭数据库 [self closeDB]; } // 查询数据 // 根据名字和年龄查询学生 - (LanOuStudent *)queryStudentWithName:(NSString *)name andAge:(NSInteger)age { //1、打开数据库 db = [self openDB]; //2、写sql语句 NSString *sql = [NSString stringWithFormat:@"select * from lanOuStudent where name = '%@' and age = '%ld'", name, age]; // 3、创建跟随指针 保存sql语句 sqlite3_stmt *stmt = nil; //4、执行语句 //<#int nByte#>表示sql语句的长度 -1代表无限长 //<#const char **pzTail#> 截取未执行的部分的语句 int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL); //5、判断是否执行成功 if (result == SQLITE_OK) { NSLog(@"查询执行成功"); //6、绑定查询信息 绑定查询条件 // 查询的条件是啥类型的 就选bind_类型 // 参数2 查询条件的顺序 从1开始 //<#const char *#>参数三 填查询条件 字段名 //<#int n#>参数四 长度 //<#void (*)(void *)#>参数5绑定后执行的函数 sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); // 绑定的条件1 sqlite3_bind_int(stmt, 2, -1); // 绑定条件2 // 7、开始查询 //sqlite3_step(stmt) == SQLITE_ROW如果这条语句可以被找到 就返回SQLITE_ROW while (sqlite3_step(stmt) == SQLITE_ROW) { //8、获取数据 // 参数2<#int iCol#>在数据库的表中的列数 列数从0开始 需要打开数据库看一下在第几列 char *name = (char *)sqlite3_column_text(stmt, 1); char *gender = (char *)sqlite3_column_text(stmt, 3); int age = sqlite3_column_int(stmt, 2); int number = sqlite3_column_int(stmt, 0); // 9、给对象赋值 LanOuStudent *student = [[LanOuStudent alloc] init]; //把c语言字符串转会OC字符串 student.name = [NSString stringWithUTF8String:name]; student.age = age; student.gender = [NSString stringWithUTF8String:gender]; student.number = number; // 10、释放跟随指针 sqlite3_finalize(stmt); // 关闭数据库 [self closeDB]; // 11、返回数据 并释放对象 return [student autorelease]; } } else { NSLog(@"查询执行失败"); } //12、关闭数据库 [self closeDB]; return nil; } // 查询所有的学生信息 - (NSArray *)queryAllStudents { //1、打开数据库 db = [self openDB]; // 2、写sql语句 NSString *sql = @"select * from lanOuStudent"; //3、创建一个跟随指针 来保存sql语句 sqlite3_stmt *stmt = nil; //4、执行语句 int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL); //5、判断是否执行成功 if (result == SQLITE_OK) { //6、不用绑定查询 创建一个数组保存查询好的model NSMutableArray *array = [NSMutableArray array]; //7、开始查询 while (sqlite3_step(stmt) == SQLITE_ROW) { // 8、获取数据 char *name = (char *)sqlite3_column_text(stmt, 1); char *gender = (char *)sqlite3_column_text(stmt, 3); int age = sqlite3_column_int(stmt, 2); int number = sqlite3_column_int(stmt, 0); // 9、创建model并赋值 LanOuStudent *student = [[LanOuStudent alloc] init]; student.name = [NSString stringWithUTF8String:name]; student.gender = [NSString stringWithUTF8String:gender]; student.age = age; student.number = number; //10、把model装进数组中 [array addObject:student]; //11、释放学生对象 [student release]; } //12、释放跟随指针 sqlite3_finalize(stmt); // 13、关闭数据库 [self closeDB]; // 返回数组 return array; } else { NSLog(@"--查询失败"); } [self closeDB]; return nil; } @end
#import <Foundation/Foundation.h> @interface LanOuStudent : NSObject @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *gender; @property (nonatomic, assign) NSInteger age; @property (nonatomic, assign) NSInteger number; @end
对封装的单例类的应用: // 创建一个manager对象 SQLiteManager *manage = [SQLiteManager shareManager]; // 打开数据库 [manage openDB]; // 关闭数据库 [manage closeDB]; // 创建一个表 [manage createTable]; // 插入数据 LanOuStudent *studnt = [[LanOuStudent alloc] init]; studnt.name = @"张三"; studnt.age = 19; studnt.gender = @"男"; studnt.number = 1; [manage insertWith:studnt]; [studnt release]; LanOuStudent *studnt1 = [[LanOuStudent alloc] init]; studnt1.name = @"李四"; studnt1.age = 19; studnt1.gender = @"男"; studnt1.number = 2; [manage insertWith:studnt1]; [studnt1 release]; // 删除数据 [manage deleteStudentWithAge:19]; // 更新数据 [manage updateStudentName:@"张三" setAge:23]; // 查询数据 返回一条 LanOuStudent *students = [manage queryStudentWithName:@"李四" andAge:19]; // 查询数据 返回多条数组 NSArray *arr = [manage queryAllStudents];