关于iOS中SQLITE句柄的使用的细节
1、设计思想:给SQLITE进行封装,利用定义的类别实现方法的简洁,以便达到低耦合效果
1 控制器代码: 2 #import "ViewController.h" 3 #import "DatabaseHelper.h" 4 5 @interface ViewController () 6 { 7 sqlite3 *db; 8 } 9 @end 10 11 @implementation ViewController 12 13 -(void)loadView { 14 15 [super loadView]; 16 self.view.backgroundColor = [UIColor orangeColor]; 17 } 18 - (void)viewDidLoad { 19 [super viewDidLoad]; 20 //PART1:该部分为实现的帮助类别 21 //PART1 .1 22 [DatabaseHelper openDatabaseWithName:@"personinfo.sqlite" withSqlite:db]; 23 //PART1 .2 24 db =[DatabaseHelper openDatabaseWithName:@"personinfo.sqlite" withSqlite:db];
25 NSLog(@" isOpenOrCreat = %@",db ?@"sucess":@"failure");
26
27 //PART2:用以判断数据库是否打开
28 if (db) {
29
30 }
31
32 //PART3:用以判断数据库是否打开
33 [DatabaseHelper execSql:@"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)" withSqlite:db];
1 操作类代码: 2 #import "DatabaseHelper.h" 3 4 @implementation DatabaseHelper 5 +(sqlite3 *)openDatabaseWithName:(NSString *)name withSqlite:(sqlite3 *)sqlite3{ 6 //PART5: 7 //1、获取Documents文件路径 8 NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; 9 //2、拼接要建立的数据库文件路径 10 NSString *databasePath = [documentsPath stringByAppendingPathComponent:name]; 11 //打印 12 NSLog(@"databasePath = %@",databasePath); 13 //判断是否已经打开(打开失败时关闭数据库并log提示) 14 if (sqlite3_open([databasePath UTF8String], &sqlite3) != SQLITE_OK) { 15 sqlite3_close(sqlite3); 16 NSLog(@"数据库打开失败"); 17 return nil ; 18 } 19 20 //PART4: 21 // char *err; 22 // NSString *sql = @"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)"; 23 // if (sqlite3_exec(sqlite3, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { 24 // sqlite3_close(sqlite3); 25 // NSLog(@"数据库操作数据失败!"); 26 // NSLog(@"%s ",err); 27 // } 28 29 return sqlite3; 30 } 31 32 +(BOOL)execSql:(NSString *)sql withSqlite:(sqlite3 *)sqlite3{ 33 char *err; 34 //sqlite3_exec(), 执行非查询的sql语句 35 if (sqlite3_exec(sqlite3, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { 36 sqlite3_close(sqlite3); 37 NSLog(@"数据库操作数据失败!"); 38 return NO; 39 } 40 return YES; 41 42 }
问题:
1、当注掉PART1.1 数据库可以被写入
2、当注掉PART1.1、PART4 后数据库不能被写入
3、当注掉PART1.2、PART4 数据库可以被写入
结论:
1、句柄的存在必须依赖于上下文,数据库的操作必须依赖于句柄存在的内容。
2、只有句柄前后相对应才能实现对数据库的操作.