zoukankan      html  css  js  c++  java
  • 公布一个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  
  • 相关阅读:
    ROS学习笔记六:xxx.launch文件详解
    XML 基础学习
    Qt之界面(自定义标题栏、无边框、可移动、缩放)
    (转)YV12 and NV12
    FFMPEG的解码后的数据格式
    (转)使用AfxGetMainWnd函数的一个心得
    mout系统流程
    关于多画面窗口切换的刷新重绘问题
    (转)Invalidate、RedrawWindow与UpdateWindow的区别
    (转)关于三星cortex A9 Sate4412 开发板 uboot 启动的一些问题释疑
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2984269.html
Copyright © 2011-2022 走看看