公布一个IOS上线程安全的sqlite库
来源:互联网 发布:js数组和对象的区别 编辑:程序博客网 时间:2024/05/04 03:31
我也是在网络上找的,自己加了锁,支持线程安全
.h文件
#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文件
#import "DatabaseOperation.h"struct lockhelp{ lockhelp(NSLock* p):lock_((NSLock*)p) {[lock_ lock];} ~lockhelp() {[lock_ unlock];}private: NSLock* lock_;};@implementation DatabaseOperation@synthesize m_sql;@synthesize m_dbName;- (id) initWithDbName:(NSString*)dbname{ self = [super init]; if (self != nil) { m_lcok = [[NSLock alloc] init]; if ([self openOrCreateDatabase:dbname]) { [self closeDatabase]; } } return self;}- (id) init{ NSAssert(0,@"Never Use this.Please Call Use initWithDbName:(NSString*)"); return nil;}- (void) dealloc{ [m_lcok unlock]; [m_lcok release]; self.m_sql = nil; self.m_dbName =nil; [super dealloc];}//-------------------创建数据库--------------------------(BOOL)openOrCreateDatabase:(NSString*)dbName{ lockhelp lock(m_lcok); self.m_dbName = dbName; NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDirectory = [path objectAtIndex:0]; if(sqlite3_open([[documentsDirectory stringByAppendingPathComponent:dbName]UTF8String],&m_sql) !=SQLITE_OK) { NSLog(@"创建数据库失败"); return NO; } return YES;}//------------------创建表-----------------------(BOOL)createTable:(NSString*)sqlCreateTable{ if (![self openOrCreateDatabase:self.m_dbName]) { return NO; } { lockhelp lock(m_lcok); char *errorMsg; if (sqlite3_exec (self.m_sql, [sqlCreateTable UTF8String],NULL,NULL, &errorMsg) != SQLITE_OK) { NSLog(@"创建数据表失败:%s",errorMsg); return NO; } } [self closeDatabase]; return YES;}//----------------------关闭数据库------------------(void)closeDatabase{ sqlite3_close(self.m_sql); }//------------------insert--------------------(BOOL)InsertTable:(NSString*)sqlInsert{ if (![self openOrCreateDatabase:self.m_dbName]) { return NO; } lockhelp lock(m_lcok); char* errorMsg = NULL; if(sqlite3_exec(self.m_sql, [sqlInsert UTF8String],0,NULL, &errorMsg) ==SQLITE_OK) { [self closeDatabase]; return YES;} else { printf("更新表失败:%s",errorMsg); [self closeDatabase]; return NO; } return YES;}//--------------updata--------------(BOOL)UpdataTable:(NSString*)sqlUpdata{ if (![self openOrCreateDatabase:self.m_dbName]) { return NO; } lockhelp lock(m_lcok); char *errorMsg; if (sqlite3_exec (self.m_sql, [sqlUpdata UTF8String],0,NULL, &errorMsg) !=SQLITE_OK) { [self closeDatabase]; return YES; }else { return NO; } return YES;}//--------------delete---------------(BOOL)DeldeteTable:(NSString*)sqlDelete{ if (![self openOrCreateDatabase:self.m_dbName]) { return NO; } lockhelp lock(m_lcok); char *errorMsg; if (sqlite3_exec (self.m_sql, [sqlDelete UTF8String],0,NULL, &errorMsg) !=SQLITE_OK) { [self closeDatabase]; return YES; }else { return NO; } return YES;}//--------------select----------------------(NSArray*)querryTable:(NSString*)sqlQuerry{ if (![self openOrCreateDatabase:self.m_dbName]) { return nil; } lockhelp lock(m_lcok); int row = 0; int column = 0; char* errorMsg = NULL; char** dbResult = NULL; NSMutableArray* array = [[NSMutableArray alloc]init]; if(sqlite3_get_table(m_sql, [sqlQuerry UTF8String], &dbResult, &row,&column,&errorMsg ) ==SQLITE_OK) { if (0 == row) { [self closeDatabase]; return nil; } int index = column; for(int i =0; i < row ; i++ ) { NSMutableDictionary* dic = [[NSMutableDictionary alloc]init]; for(int j =0 ; j < column; j++ ) { if (dbResult[index]) { NSString* value = [[NSString alloc]initWithUTF8String:dbResult[index]]; NSString* key = [[NSString alloc]initWithUTF8String:dbResult[j]]; [dic setObject:value forKey:key]; [value release]; [key release]; } index ++; } [array addObject:dic]; [dic release]; } }else { printf("%s",errorMsg); [self closeDatabase]; return nil; } [self closeDatabase]; return [array autorelease];}//----------------------select--------------------int processData(void* arrayResult,int columnCount,char** columnValue,char** columnName){ int i; NSMutableDictionary* dic = [[NSMutableDictionary alloc]init]; for( i = 0 ; i < columnCount; i ++ ) { if (columnValue[i]) { NSString* key = [[NSString alloc]initWithUTF8String:columnName[i]]; NSString* value = [[NSString alloc]initWithUTF8String:columnValue[i]]; [dic setObject:value forKey:key]; } } [(NSMutableArray*)arrayResult addObject:dic]; [dic release]; return 0; }//---------------------select------------------------(NSArray*)querryTableByCallBack:(NSString*)sqlQuerry{ if (![self openOrCreateDatabase:self.m_dbName]) { return nil; } lockhelp lock(m_lcok); char* errorMsg = NULL; NSMutableArray* arrayResult = [[NSMutableArray alloc]init]; if (sqlite3_exec(self.m_sql,[sqlQuerry UTF8String],processData,(void*)arrayResult,&errorMsg) !=SQLITE_OK) { printf("查询出错:%s",errorMsg); } [self closeDatabase]; return [arrayResult autorelease];}@end
有问题的可以留言!
- 公布一个IOS上线程安全的sqlite库
- Android SQLite是线程安全的吗?
- Android SQLite是线程安全的吗?
- Android SQLite是线程安全的吗?
- 【iOS开发-105】SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全
- ios数据库sqlite-第三方框架FMDB,关于线程安全的事务处理
- ios数据库sqlite-第三方框架FMDB,关于线程安全的事务处理
- Sqlite线程安全
- iOS中单例的线程安全
- iOS中单例的线程安全
- iOS中单例的线程安全
- iOS线程安全的问题
- iOS 多个线程对数组操作(遍历,插入,删除),实现一个线程安全的NSMutabeArray
- iOS上数据库SQLite的简单操作
- Charles McAuley在全面揭露安全邮件列表上公布的消息
- SQLITE在ANDROID上的一个BUG
- iOS开发里的线程安全机制
- iOS开发里的线程安全机制
- 加权拟合算法
- ssl的安装出错 安装依赖
- 字典树+静态存储
- Flex采用blazeds实现服务器向(特定标识的)客户端推数据(基于consumer模式)
- MySQL常用函数
- 公布一个IOS上线程安全的sqlite库
- 编程珠玑(2)第八章学习笔记
- Internal Server Error The server encountered an internal error or misconfiguration and was unable to
- 时间戳转化为今天什么什么时间,昨天什么什么时间【ios】
- window核心编程--堆
- java编程学习方法建议
- VS2010 ATL 控件开发
- 难以琢磨的redo log (什么情况下产生redo)
- SQl语名的学习