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