新建一個繼承與NSObject的類葡兑,在延展中聲明一個字符串類型的屬性用來存儲數(shù)據(jù)庫文件路徑奖蔓。
@property(nonatomic,strong)NSString* dbFileName;//數(shù)據(jù)庫文件路徑
給這個類添加一個單例的方法,保持該類對象的唯一
//單例方法
+ (DatabaseHelper*)shareDataBaseHelper{
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:@""];
//判斷用戶傳遞進(jìn)來的文件名是否為nil
if (fileName) {
//判斷文件名是否為空字符串
if (fileName.length == 0) {
//空字符串@“”
NSLog(@"數(shù)據(jù)庫文件無名稱锭硼,當(dāng)程序關(guān)閉的時(shí)候,數(shù)據(jù)庫文件也會銷毀");
}else{
//判斷文件名是否帶后綴名蜕劝,如果有直接使用檀头,如果沒有后綴名,添加后綴名之后在使用
if (![fileName hasSuffix:@".sqlite"]) {
//如果沒有后綴名岖沛,先添加在使用
[fileName stringByAppendingString:@".sqlite"];
}
}
}else{
//說明文件名為nil
NSLog(@"數(shù)據(jù)庫文件無名稱暑始,當(dāng)程序關(guān)閉的時(shí)候,數(shù)據(jù)庫文件也會銷毀");
fileName = @"";
}
//將文件名稱拼接成有效的文件路徑
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//將處理好的文件名賦值給屬性婴削,讓其他方法使用
self.dbFileName = [documentsPath stringByAppendingPathComponent:fileName];
}
打開或創(chuàng)建數(shù)據(jù)庫
//打開或者創(chuàng)建數(shù)據(jù)庫
- (sqlite3 *)openOrCreateDB{
sqlite3 *sqlite = nil;
int result = sqlite3_open(self.dbFileName.UTF8String, &sqlite);
if (result == SQLITE_OK) {
NSLog(@"數(shù)據(jù)庫打開成功");
return sqlite;
}else{
NSLog(@"數(shù)據(jù)庫打開失敗-----%d",result);
return NULL;
}
}
無返回集的操作方法(非查詢方法)
//無返回集執(zhí)行的方法
- (BOOL)noQueryWithSql:(NSString *)sql{
//執(zhí)行任何操作之前先打開數(shù)據(jù)庫廊镜,操作執(zhí)行完畢之后,關(guān)閉數(shù)據(jù)庫
sqlite3 *sqlite = [self openOrCreateDB];
//執(zhí)行sql語句
//保證數(shù)據(jù)庫打開成功
if (sqlite) {
int result = sqlite3_exec(sqlite, sql.UTF8String, NULL, NULL, NULL);
//當(dāng)操作有結(jié)果的時(shí)候唉俗,要關(guān)閉數(shù)據(jù)庫
sqlite3_close(sqlite);
if (result == SQLITE_OK) {
NSLog(@"執(zhí)行非查詢操作成功");
return YES;
}else{
NSLog(@"執(zhí)行非查詢操作失敗-----%d",result);
return NO;
}
}else{
NSLog(@"執(zhí)行非查詢操作時(shí)打開數(shù)據(jù)庫失敗");
return NO;
}
}
通用的查詢方法
//通用查詢的方法
- (NSMutableArray*)queryWithSql:(NSString *)sql{
//創(chuàng)建可變數(shù)組嗤朴,用來存放所有的記錄
NSMutableArray* resultMArray = [[NSMutableArray alloc] init];
//打開數(shù)據(jù)庫
sqlite3 *sqlite = [self openOrCreateDB];
//聲明伴隨指針,用來存放所有的記錄
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(sqlite, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
//說明sql語句沒有問題
//從伴隨指針中遍歷取出每一條記錄
while (sqlite3_step(stmt) == SQLITE_ROW) {
//沒執(zhí)行一次循環(huán)體虫溜,就取出一條記錄
NSMutableDictionary* rowMDic = [[NSMutableDictionary alloc] init];
//確定該條記錄有幾個字段
int sumColumn = sqlite3_column_count(stmt);
//for循環(huán)遍歷一條記錄中的所有字段雹姊,給字典賦值
for (int i = 0; i < sumColumn; i++) {
//獲取當(dāng)前列的數(shù)據(jù)類型
int type = sqlite3_column_type(stmt, i);
//獲取當(dāng)前列的字段名
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);
//賦值
[rowMDic setObject:@(value) forKey:key];
}
break;
case SQLITE_TEXT:
//字符串類型
{
//取值
const unsigned char *value = sqlite3_column_text(stmt, i);
NSString* stringValue = [NSString stringWithCString:(const char*)(value) encoding:NSUTF8StringEncoding];
//賦值
[rowMDic setObject:stringValue forKey:key];
}
break;
//若需要獲取更多類型的表信息,則可以添加對應(yīng)的case分支
default:
break;
}
}
//for循環(huán)結(jié)束后把字典添加到數(shù)組中
[resultMArray addObject:rowMDic];
}
//while循環(huán)結(jié)束衡楞,所有的記錄都已經(jīng)獲取完成
}else{
//說明sql語句有問題
NSLog(@"執(zhí)行查詢操作失敗-----%d",result);
}
//釋放資源
if (stmt != nil) {
sqlite3_finalize(stmt);
}
//關(guān)閉數(shù)據(jù)庫
sqlite3_close(sqlite);
//返回
return resultMArray;
}
最后吱雏,在(頭文件中).h中暴露相應(yīng)的方法給外部調(diào)用