公布一个IOS上线程安全的sqlite库 (转)

我也是在网络上找的,自己加了锁,支持线程安全
.h文件
 
  1. #import <Foundation/Foundation.h>   
  2. #import "sqlite3.h"   
  3. @interface DatabaseOperation : NSObject {  
  4.     sqlite3 *m_sql;  
  5.     NSString *m_dbName;  
  6.     NSLock*  m_lcok;  
  7. }  
  8. @property(nonatomic)sqlite3*            m_sql;  
  9. @property(nonatomic,retain)NSString*    m_dbName;  
  10.   
  11. -(id)initWithDbName:(NSString*)dbname;  
  12. -(BOOL)openOrCreateDatabase:(NSString*)DbName;  
  13. -(BOOL)createTable:(NSString*)sqlCreateTable;  
  14. -(void)closeDatabase;  
  15. -(BOOL)InsertTable:(NSString*)sqlInsert;  
  16. -(BOOL)UpdataTable:(NSString*)sqlUpdata;  
  17. -(BOOL)DeldeteTable:(NSString*)sqlDelete;  
  18. -(NSArray*)querryTable:(NSString*)sqlQuerry;  
  19. -(NSArray*)querryTableByCallBack:(NSString*)sqlQuerry;  
  20. @end  
#import <Foundation/Foundation.h>
#import "sqlite3.h"
@interface DatabaseOperation : NSObject {
    sqlite3 *m_sql;
    NSString *m_dbName;
    NSLock*  m_lcok;
}
@property(nonatomic)sqlite3*            m_sql;
@property(nonatomic,retain)NSString*    m_dbName;

-(id)initWithDbName:(NSString*)dbname;
-(BOOL)openOrCreateDatabase:(NSString*)DbName;
-(BOOL)createTable:(NSString*)sqlCreateTable;
-(void)closeDatabase;
-(BOOL)InsertTable:(NSString*)sqlInsert;
-(BOOL)UpdataTable:(NSString*)sqlUpdata;
-(BOOL)DeldeteTable:(NSString*)sqlDelete;
-(NSArray*)querryTable:(NSString*)sqlQuerry;
-(NSArray*)querryTableByCallBack:(NSString*)sqlQuerry;
@end

.m文件

  1. #import "DatabaseOperation.h"   
  2.   
  3. struct lockhelp  
  4. {  
  5.     lockhelp(NSLock* p):lock_((NSLock*)p)   {[lock_ lock];}  
  6.     ~lockhelp()                             {[lock_ unlock];}  
  7. private:  
  8.     NSLock* lock_;  
  9. };  
  10.   
  11. @implementation DatabaseOperation  
  12. @synthesize m_sql;  
  13. @synthesize m_dbName;  
  14. - (id) initWithDbName:(NSString*)dbname  
  15. {  
  16.     self = [super init];  
  17.     if (self != nil) {  
  18.           
  19.         m_lcok = [[NSLock alloc] init];  
  20.           
  21.         if ([self openOrCreateDatabase:dbname]) {  
  22.             [self closeDatabase];  
  23.         }  
  24.           
  25.     }  
  26.     return self;  
  27. }  
  28. - (id) init  
  29. {  
  30.     NSAssert(0,@"Never Use this.Please Call Use initWithDbName:(NSString*)");  
  31.     return nil;  
  32. }  
  33. - (void) dealloc  
  34. {  
  35.     [m_lcok unlock];  
  36.     [m_lcok release];  
  37.       
  38.     self.m_sql = nil;  
  39.     self.m_dbName =nil;  
  40.     [super dealloc];  
  41. }  
  42. //-------------------创建数据库-------------------------   
  43. -(BOOL)openOrCreateDatabase:(NSString*)dbName  
  44. {  
  45.     lockhelp lock(m_lcok);  
  46.     self.m_dbName = dbName;  
  47.     NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);  
  48.     NSString *documentsDirectory = [path objectAtIndex:0];  
  49.     if(sqlite3_open([[documentsDirectory stringByAppendingPathComponent:dbName]UTF8String],&m_sql) !=SQLITE_OK)  
  50.     {  
  51.         NSLog(@"创建数据库失败");  
  52.         return    NO;  
  53.     }  
  54.     return YES;  
  55. }  
  56. //------------------创建表----------------------   
  57. -(BOOL)createTable:(NSString*)sqlCreateTable  
  58. {  
  59.     if (![self openOrCreateDatabase:self.m_dbName]) {  
  60.         return NO;  
  61.     }  
  62.       
  63.     {  
  64.         lockhelp lock(m_lcok);  
  65.         char *errorMsg;  
  66.         if (sqlite3_exec (self.m_sql, [sqlCreateTable UTF8String],NULL,NULL, &errorMsg) != SQLITE_OK)  
  67.         {  
  68.             NSLog(@"创建数据表失败:%s",errorMsg);  
  69.             return NO;  
  70.         }  
  71.     }  
  72.       
  73.     [self closeDatabase];  
  74.     return YES;  
  75. }  
  76. //----------------------关闭数据库-----------------   
  77. -(void)closeDatabase  
  78. {  
  79.     sqlite3_close(self.m_sql);   
  80. }  
  81. //------------------insert-------------------   
  82. -(BOOL)InsertTable:(NSString*)sqlInsert  
  83. {  
  84.     if (![self openOrCreateDatabase:self.m_dbName]) {  
  85.         return NO;  
  86.     }  
  87.       
  88.     lockhelp lock(m_lcok);  
  89.       
  90.     char* errorMsg = NULL;  
  91.     if(sqlite3_exec(self.m_sql, [sqlInsert UTF8String],0,NULL, &errorMsg) ==SQLITE_OK)  
  92.     {  [self closeDatabase];  
  93.         return YES;}  
  94.     else {  
  95.         printf("更新表失败:%s",errorMsg);  
  96.         [self closeDatabase];  
  97.         return NO;  
  98.     }     
  99.     return YES;  
  100. }  
  101. //--------------updata-------------   
  102. -(BOOL)UpdataTable:(NSString*)sqlUpdata{  
  103.     if (![self openOrCreateDatabase:self.m_dbName]) {  
  104.         return NO;  
  105.     }  
  106.       
  107.     lockhelp lock(m_lcok);  
  108.     char *errorMsg;  
  109.     if (sqlite3_exec (self.m_sql, [sqlUpdata UTF8String],0,NULL, &errorMsg) !=SQLITE_OK)  
  110.     {  
  111.         [self closeDatabase];  
  112.         return YES;  
  113.     }else {  
  114.         return NO;  
  115.     }  
  116.     return YES;  
  117. }  
  118. //--------------delete--------------   
  119. -(BOOL)DeldeteTable:(NSString*)sqlDelete  
  120. {  
  121.     if (![self openOrCreateDatabase:self.m_dbName]) {  
  122.         return NO;  
  123.     }  
  124.       
  125.     lockhelp lock(m_lcok);  
  126.     char *errorMsg;  
  127.     if (sqlite3_exec (self.m_sql, [sqlDelete UTF8String],0,NULL, &errorMsg) !=SQLITE_OK)  
  128.     {  
  129.         [self closeDatabase];  
  130.         return YES;  
  131.     }else {  
  132.         return NO;  
  133.     }  
  134.     return YES;  
  135. }  
  136. //--------------select---------------------   
  137. -(NSArray*)querryTable:(NSString*)sqlQuerry  
  138. {  
  139.     if (![self openOrCreateDatabase:self.m_dbName]) {  
  140.         return nil;  
  141.     }  
  142.       
  143.     lockhelp lock(m_lcok);  
  144.     int row = 0;  
  145.     int column = 0;  
  146.     char*    errorMsg = NULL;  
  147.     char**    dbResult = NULL;  
  148.     NSMutableArray*    array = [[NSMutableArray alloc]init];  
  149.     if(sqlite3_get_table(m_sql, [sqlQuerry UTF8String], &dbResult, &row,&column,&errorMsg ) ==SQLITE_OK)  
  150.     {  
  151.         if (0 == row) {  
  152.             [self closeDatabase];  
  153.             return nil;  
  154.         }  
  155.         int index = column;  
  156.         for(int i =0; i < row ; i++ ) {    
  157.             NSMutableDictionary*    dic = [[NSMutableDictionary alloc]init];  
  158.             for(int j =0 ; j < column; j++ ) {  
  159.                 if (dbResult[index]) {  
  160.                     NSString*    value = [[NSString alloc]initWithUTF8String:dbResult[index]];  
  161.                     NSString*    key = [[NSString alloc]initWithUTF8String:dbResult[j]];  
  162.                     [dic setObject:value forKey:key];  
  163.                     [value release];  
  164.                     [key release];  
  165.                 }  
  166.                 index ++;  
  167.             }   
  168.             [array addObject:dic];  
  169.             [dic release];     
  170.         }  
  171.     }else {  
  172.         printf("%s",errorMsg);  
  173.         [self closeDatabase];  
  174.         return nil;  
  175.     }  
  176.     [self closeDatabase];     
  177.     return [array autorelease];  
  178. }  
  179. //----------------------select--------------------   
  180. int processData(void* arrayResult,int columnCount,char** columnValue,char** columnName)  
  181. {  
  182.     int i;   
  183.     NSMutableDictionary* dic = [[NSMutableDictionary alloc]init];  
  184.     for( i = 0 ; i < columnCount; i ++ )   
  185.     {   
  186.         if (columnValue[i]) {  
  187.             NSString* key = [[NSString alloc]initWithUTF8String:columnName[i]];  
  188.             NSString* value = [[NSString alloc]initWithUTF8String:columnValue[i]];  
  189.             [dic setObject:value forKey:key];     
  190.         }    
  191.     }   
  192.     [(NSMutableArray*)arrayResult addObject:dic];  
  193.     [dic release];     
  194.     return 0;   
  195. }  
  196. //---------------------select-----------------------   
  197. -(NSArray*)querryTableByCallBack:(NSString*)sqlQuerry  
  198. {  
  199.     if (![self openOrCreateDatabase:self.m_dbName]) {  
  200.         return nil;  
  201.     }  
  202.     lockhelp lock(m_lcok);  
  203.     char*    errorMsg = NULL;  
  204.     NSMutableArray* arrayResult = [[NSMutableArray alloc]init];  
  205.     if (sqlite3_exec(self.m_sql,[sqlQuerry UTF8String],processData,(void*)arrayResult,&errorMsg) !=SQLITE_OK) {  
  206.         printf("查询出错:%s",errorMsg);  
  207.     }  
  208.     [self closeDatabase];     
  209.     return [arrayResult autorelease];  
  210. }  
  211. @end  
原文地址:https://www.cnblogs.com/lzjsky/p/2984269.html