ios sqlite3多執行緒操作
阿新 • • 發佈:2019-01-22
記錄下
單例的巨集使用,是為了簡化及統一,使用,參考前一篇文章或是去網上找相關的程式碼。
部分程式碼參考自網際網路,主要是加了pthread_mutex_t, 保證執行緒安全, 在openDb, closeDb中lock, unlock保證安全,因此在操作資料庫時,保證呼叫openDb, closeDb,成對使用,不要去考慮在主執行緒,還是其它執行緒中使用資料庫了。
只是提供一個框架和示例,具體應用根據自己的需要去新增。
標頭檔案
#import <Foundation/Foundation.h>
#include "SingletonMacro.h"
@interface VRSQLite : NSObject
HFSingletonH(VRSQLite)
@end
實現檔案
#import "VRSQLite.h"
#import <sqlite3.h>
#include <pthread.h>
@interface VRSQLite ()
{
//資料指標,通過指標可以操作對應的資料庫
sqlite3 *dbPoint ;
pthread_mutex_t mutex;
}
@end
@implementation VRSQLite
HFSingletonM(VRSQLite)
-(instancetype) init{
self = [super init];
if(self){
[self setup];
}
return self;
}
- (void) setup{
pthread_mutex_init(&mutex, NULL);
[self createTable];
}
//開啟資料庫
-(void)openDb{
pthread_mutex_lock(&mutex);
//想要開啟的資料可路徑
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES ) firstObject] stringByAppendingPathComponent:@"vr.db"];
NSLog(@"%@",dbPath);
/*
引數1:想要開啟的資料庫的路徑,需要的是C語言的字串
引數2:將dbPoint 指標和資料庫繫結,通過dbPoint可以訪問該路徑下的資料庫
如果該路徑下不存在對應的資料庫,系統會自動建立一個數據庫
*/
int result = sqlite3_open(dbPath.UTF8String, &dbPoint);
if (SQLITE_OK == result ) {
NSLog(@"資料庫開啟成功");
}
else
{
NSLog(@"資料庫開啟失敗");
}
}
//關閉資料庫
-(void)closeDb{
int result = sqlite3_close(dbPoint) ;
[self judgeWithResult:result action:@"關閉資料庫"];
pthread_mutex_unlock(&mutex);
}
-(void)judgeWithResult:(int)result action:(NSString *)actionStr{
if (result == SQLITE_OK) {
NSLog(@"%@成功",actionStr);
}
else
{
NSLog(@"%@失敗",actionStr);
}
}
//建立表
-(void)createTable{
[self openDb];
NSString *sqlStr = @"create table vritem (localIdentifier text , media_id text )";
/**
* 引數1:要使用的是哪一個資料庫
* 引數2:想對資料做什麼操作 SQL語句
* 引數3/4:系統預留的引數
* 引數5:錯誤資訊
*
* @return return value description
*/
char **error ;
int result = sqlite3_exec(dbPoint, sqlStr.UTF8String, NULL, NULL, &error);
NSLog(@"%s",error);
[self judgeWithResult:result action:@"建立表"];
//銷燬指標
sqlite3_free(error) ;
[self closeDb];
}
//新增
-(void)insertItem:(PTCloudSqlModel *)stu{
[self openDb];
NSString *sqlStr = [NSString stringWithFormat:@"insert into vritem values ('%@','%@')",stu.localIdentifier,stu.media_id];
char**error ;
int result = sqlite3_exec(dbPoint, sqlStr.UTF8String, NULL, NULL, &error);
[self judgeWithResult:result action:@"插入"];
sqlite3_free(error);
[self closeDb];
}
//刪除記錄
-(void)deleteItem:(PTCloudSqlModel *)stu{
[self openDb];
NSString *sqlStr = [NSString stringWithFormat:@"delete from vritem where localIdentifier = \'%@' ",stu.localIdentifier];
char **error ;
int result = sqlite3_exec(dbPoint, sqlStr.UTF8String, NULL, NULL, &error);
[self judgeWithResult:result action:@"刪除"];
sqlite3_free(error);
[self closeDb];
}
@end