#import "DataBaseHelper.h"
#import <sqlite3.h>
@interface DataBaseHelper (){
sqlite3* sqliteHandle;
}
@property(nonatomic,retain)NSString* dbFileName;//數(shù)據(jù)庫文件路徑
@end
@implementation DataBaseHelper
+(DataBaseHelper*)sharedDataBaseHelper{
static DataBaseHelper* dbHelper=nil;
if (dbHelper==nil) {
dbHelper=[[DataBaseHelper alloc] init];
}
return dbHelper;
}
//創(chuàng)建數(shù)據(jù)庫文件存儲的路徑,一般在documents和library/caches
-(void)dbFileNameWithName:(NSString*)fileName{
//將fileName中的空格替換掉
fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@""];
//判斷用戶傳遞進來的文件名是否為nil或者為空字符串
if (fileName) {
//判斷文件名是否為空字符串
if (fileName.length == 0) {
//空字符串@""
NSLog(@"數(shù)據(jù)庫文件無名稱,當程序關閉的時候,數(shù)據(jù)庫文件也會銷毀");
}else{
//判斷文件名是否帶后綴名,如果有就直接使用,如果沒有,就添加后綴名之后在使用
if (![fileName hasSuffix:@".sqlite"]) {
//如果沒有后綴名,添加后綴名之后在使用
fileName = [fileName stringByAppendingString:@".sqlite"];
}
}
}else{
//說明文件名為nil
NSLog(@"數(shù)據(jù)庫文件無名稱,當程序關閉的時候,數(shù)據(jù)庫文件也會銷毀");
fileName=@"";
}
//將文件名稱拼接成有效的文件路徑
NSString* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
fileName=[docPath stringByAppendingPathComponent:fileName];
//將處理好的文件名賦值給屬性,讓其他方法使用
self.dbFileName=fileName;
}
//打開或者創(chuàng)建數(shù)據(jù)庫文件
-(sqlite3*)creatDB{
int result=sqlite3_open(self.dbFileName.UTF8String, &sqliteHandle);
if (result==SQLITE_OK) {
NSLog(@"創(chuàng)建或者打開數(shù)據(jù)庫成功");
return sqliteHandle;
}else{
NSLog(@"創(chuàng)建或者打開數(shù)據(jù)庫失敗----%d",result);
return NULL;
}
}
//無返回結果集執(zhí)行的方法
-(BOOL)noQueryWithSql:(NSString*)sql{
//執(zhí)行任何數(shù)據(jù)庫操作之前,先打開數(shù)據(jù)庫;操作執(zhí)行完畢之后記得關閉數(shù)據(jù)庫
sqlite3* sqlite=[self creatDB];
//執(zhí)行sql語句
if (sqlite) {//保證數(shù)據(jù)庫打開成功
int result=sqlite3_exec(sqlite, sql.UTF8String, NULL, NULL, NULL);
//當操作有結果的時候一定要關閉數(shù)據(jù)庫
sqlite3_close(sqlite);
if (result==SQLITE_OK) {
NSLog(@"執(zhí)行非查詢操作成功");
return YES;
}else{
NSLog(@"執(zhí)行非查詢操作失敗-----%d",result);
return NO;
}
}
//說明數(shù)據(jù)庫打開失敗
NSLog(@"執(zhí)行查詢操作的時候,打開數(shù)據(jù)庫失敗了");
return NO;
}
//通用查詢方法
-(NSArray*)queryWithSql:(NSString*)sql{
//打開數(shù)據(jù)庫
sqlite3* sqlite=[self creatDB];
//創(chuàng)建可變數(shù)組,用來存放所有的記錄
NSMutableArray* resultMArray=[[NSMutableArray alloc] init];
//聲明伴隨指針,用來存放所有的記錄
sqlite3_stmt* stmt=NULL;
//預執(zhí)行
int result=sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
if (result==SQLITE_OK) {
//說明sql語句沒有問題
NSLog(@"執(zhí)行查詢操作成功");
//從伴隨指針中取出每一條記錄
while (sqlite3_step(stmt)==SQLITE_ROW) {
//每執(zhí)行一次循環(huán)體,就取出一條記錄
NSMutableDictionary* mDic=[[NSMutableDictionary alloc] init];
//確定改條記錄有幾個字段
int sumColumn=sqlite3_column_count(stmt);
//for循環(huán)遍歷一條記錄中的所有字段
for (int i=0; i<sumColumn; i++) {
//獲取當前列的數(shù)據(jù)類型
int type = sqlite3_column_type(stmt, i);
//獲取字段名
const char * name = sqlite3_column_name(stmt, i);
NSString* key=[NSString stringWithCString:name encoding:NSUTF8StringEncoding];
//取出每一列的值
switch (type) {
case SQLITE_INTEGER:{
//int類型
int value=sqlite3_column_int(stmt, i);
//為字典賦值
[mDic setObject:@(value) forKey:key];
}
break;
case SQLITE_TEXT:{
//字符串類型
const unsigned char* value=sqlite3_column_text(stmt, i);
NSString* valueStr=[NSString stringWithCString:( const char *)value encoding:NSUTF8StringEncoding];
[mDic setObject:valueStr forKey:key];
}
break;
default:
break;
}
}
//一次for循環(huán)結束,一條記錄才轉(zhuǎn)換為一個字典
[resultMArray addObject:mDic];
}
}else{
//說明sql語句有問題
NSLog(@"執(zhí)行查詢操作失敗-----%d",result);
}
//將伴隨指針所持有的資源釋放掉,關閉數(shù)據(jù)庫
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
//while循環(huán)結束,說明所有的記錄都已經(jīng)獲取完整
return resultMArray;
}
@end
以上方法均在.h中聲明即可