1. 程式人生 > >ios sqlite3多執行緒操作

ios sqlite3多執行緒操作

記錄下

單例的巨集使用,是為了簡化及統一,使用,參考前一篇文章或是去網上找相關的程式碼。
部分程式碼參考自網際網路,主要是加了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