Last active
March 25, 2016 02:34
-
-
Save fhefh2015/cc87a1f26834ac70c2e5 to your computer and use it in GitHub Desktop.
sqlite3简易封装
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// DataBaseHandler.h | |
// 代码:http://www.jianshu.com/p/a02479cc5e15 | |
// | |
#import <Foundation/Foundation.h> | |
#import <sqlite3.h> | |
@interface DataBaseHandler : NSObject | |
{ | |
sqlite3 *dbPoint; | |
} | |
// 单例的创建方法 | |
+ (DataBaseHandler *)shareInstance; | |
/** | |
* 打开数据库 | |
* | |
* @param dbname 数据库名称 | |
* | |
* @text 哪个方法 | |
*/ | |
- (void)openDb:(NSString *)dbname text:(NSString *)text; | |
/** | |
* 执行无返回值的sql | |
* | |
* @param sql sql语句 | |
* | |
* @text 哪个方法 | |
*/ | |
- (void)executeNonReturnValue:(NSString *)sql text:(NSString *)text; | |
/** | |
* 执行有返回值的sql | |
* | |
* @param sql sql语句 | |
* | |
* @return 查询结果 | |
*/ | |
- (NSArray *)executeHaveReturnValue:(NSString *)sql; | |
/** | |
* 判断数据库方法执行结果 | |
* | |
* @param result 调用数据库方法返回的结果 | |
* | |
* @text 哪个方法 | |
*/ | |
- (void)judgeResult:(int)result text:(NSString *)text; | |
@end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// DataBaseHandler.m | |
// 代码:http://www.jianshu.com/p/a02479cc5e15 | |
// | |
#import "DataBaseHandler.h" | |
@implementation DataBaseHandler | |
+ (DataBaseHandler *)shareInstance | |
{ | |
// 当第一次执行的时候会产生一个空指针 | |
static DataBaseHandler *dbHandler = nil; | |
static dispatch_once_t onceToken; | |
dispatch_once(&onceToken, ^{ | |
// 对指针进行判断, 当第一次执行的时候创建一个对象 | |
if (dbHandler == nil) { | |
dbHandler = [[DataBaseHandler alloc] init]; | |
} | |
}); | |
// 无论是创建的和已经存在的, 都在这里直接return除去 | |
return dbHandler; | |
} | |
- (void)openDb:(NSString *)dbname text:(NSString *)text | |
{ | |
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; | |
NSString *dbPath = [docPath stringByAppendingString:dbname]; | |
// 参数1: 数据库文件存储的路径 | |
// 参数2: 数据库dbPoint指针地址 | |
// 返回值: 执行sqlite函数的结果(int类型) | |
int result = sqlite3_open([dbPath UTF8String], &dbPoint); | |
// 利用封装的方法判断结果 | |
[self judgeResult:result text:text]; | |
} | |
- (void)executeNonReturnValue:(NSString *)sql text:(NSString *)text | |
{ | |
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL); | |
[self judgeResult:result text:text]; | |
} | |
- (NSArray *)executeHaveReturnValue:(NSString *)sql | |
{ | |
// 创建一个可变数组, 用于存储数据 | |
NSMutableArray *rows=[NSMutableArray array]; | |
// 创建一个数据库的替身, 存储对数据库的所有操作 | |
sqlite3_stmt *stmt = nil; | |
/** | |
* 让数据库执行sql语句, 并把结果保存到stmt中 | |
* | |
* @param dbPoint 数据库指针 | |
* @param UTF8String] sql语句 | |
* @param -1 限制sql语句的长度(如果是-1, 就是不限制) | |
* @param stmt 替身指针的地址 | |
* @param NULL 空 | |
* | |
*/ | |
int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL); | |
// 判断是否正确 | |
if (SQLITE_OK == result) { | |
// 当sql执行成功, 遍历数据 | |
// 循环遍历所有的结果, 每次遍历到一条数据, 都会返回sqlite_row, 如果没有数据了, 就不会返回SQLITE_ROW, 跳出循环 | |
while (SQLITE_ROW == sqlite3_step(stmt)) { | |
// 取int类型的数据 | |
int columnCount = sqlite3_column_count(stmt); | |
// 创建一个可变字典, 用来存储数据 | |
NSMutableDictionary *dic=[NSMutableDictionary dictionary]; | |
for (int i = 0; i < columnCount; i++) { | |
// 在循环体中去按列取数据 | |
// 取得列名 | |
const char *name = sqlite3_column_name(stmt, i); | |
// 取得某列的值 | |
const unsigned char *value = sqlite3_column_text(stmt, i); | |
// 将char *字符串转为NSString字符串 | |
dic [[NSString stringWithUTF8String:name]] = [NSString stringWithUTF8String:(const char *) value]; | |
} | |
[rows addObject:dic]; | |
} | |
} | |
// 销毁stmt替身, 把里面的操作和结果写入本地sqlite文件 | |
sqlite3_finalize(stmt); | |
return rows; | |
} | |
- (void)judgeResult:(int)result text:(NSString *)text | |
{ | |
if (result == SQLITE_OK) { | |
NSLog(@"%@成功", text); | |
} else { | |
NSLog(@"错误代码: %d", result); | |
NSLog(@"%@失败",text); | |
} | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment