当我们使用sqlite时,都需要先创建数据库创建数据表,再执行相应地sql语句,这样不利于对数据库操作进行统一管理,也不符合面向对象的思想,当我们的需求发生改变时,例如数据库表名改了,或者是要添加几个字段,这时候就会出现一种四处找数据库操作代码的情况,如果是一处两处还好,但如果是上百处,那就会是一个很大的工作量。所以我们可以来定义一个工具类sqlManager,统一对数据库操作进行管理。
/** 获取单例对象 */ + (instancetype)shareManage;
static sqlManager *_instance; + (instancetype)shareManage { static dispatch_once_t onceToken; dispatch_once(&onceToken,^{ _instance = [[sqlManager alloc] init]; }); return _instance; }
既然是数据库管理工具类,要对数据库进行操作,同样地我们需要创建数据库还有数据库表,创建只需要一个次,所以可以将创建代码写在initialize方法里面,initialize方法是当这个类第一次被使用的时候就会调用该方法,而且在app的生命周期中只会调用一次
+ (void)initialize { // 拼接数据库地址 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]; NSString *sqlFile = [path stringByAppendingPathComponent:@"student.sqlite"]; // 打开数据 int result = sqlite3_open(sqlFile.UTF8String,&_db);// [self db] // 判断是否打开成功 if (result == sqlITE_OK) { NSLog(@"打开成功"); // 3.1创建表 NSString *sql = @"CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER,score REAL);"; result = sqlite3_exec(_db,sql.UTF8String,NULL,NULL); } }
/** 插入学生数据 */ - (BOOL)insertStudent:(HMStudent *)student;
当然我们首先需要定义一个学生模型来存储数据,学生类中得字段根数据库表中得字段一一对应
@property (nonatomic,copy) NSString *name; @property (nonatomic,assign) int age; @property (nonatomic,assign) double score; @property (nonatomic,assign) int ID;
insertStudent:方法的实现如下
- (BOOL)insertStudent:(HMStudent *)student { NSString *sql = [NSString stringWithFormat: @"INSERT INTO t_student(age,score,name) VALUES (%d,%f,'%@');",student.age,student.score,student.name]; int result = sqlite3_exec(_db,NULL); if (result == sqlITE_OK) { return YES; } return NO; }
如此该方法就封装了一个插入操作。
Student *stu = [[Student alloc] init]; stu.name = @"lnj"; stu.age = 30; stu.score = 100.0; if ([[sqlManager shareManage]insertStudent:stu]) { NSLog(@"插入成功"); }
以此类推,我们可以封装其他的删除修改操作,以后如果出现什么数据库需求修改时,我们就只用专心的修改工具类就行了,就不用四处的去找数据库相关操作的代码了,而且相比较于之间操作数据库的方式,以上代码更具备阅读性。
查询的方式比较特殊,现在就来简单的实现以下。
同样需要对外提供一个借口
- (NSArray *)query;
NSString *sql = @"SELECT * FROM t_student;"; sqlite3_stmt *stemt = NULL; sqlite3_prepare_v2(_db,-1,&stemt,NULL); // 判断有没有查询结果 NSMutableArray *arrM = [NSMutableArray array]; while (sqlite3_step(stemt) == sqlITE_ROW) { // 取出查询到得结果 const unsigned char *name = sqlite3_column_text(stemt,1); int age = sqlite3_column_int(stemt,2); double score = sqlite3_column_double(stemt,3); HMStudent *stu = [[HMStudent alloc] init]; stu.name = [NSString stringWithUTF8String:name]; stu.age = age; stu.score = score; [arrM addObject:stu]; } return arrM;
NSArray *arr = [[sqlManager shareManage] query]; for (Student *stu in arr) { NSLog(@"%@",stu); }