2013-03-25 17:41 261人阅读 评论(0) 收藏 举报

  1. //
  2. #import <Foundation/Foundation.h>
  3. #import "sqlite3.h"
  4. @interface Sqllib : NSObject
  5. {
  6. sqlite3 *m_sql;
  7. NSString *m_dbName;
  8. }
  9. @property(nonatomic)sqlite3*  m_sql;
  10. @property(nonatomic,retain)NSString*  m_dbName;
  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. -(NSArray*)querryTable:(NSString*)sqlQuerry;
  18. -(NSArray*)querryTableByCallBack:(NSString*)sqlQuerry;
  19. @end
  20. //
  21. #import "sqllib.h"
  22. @implementation Sqllib
  23. @synthesize m_sql;
  24. @synthesize m_dbName;
  25. -(id) initWithDbName:(NSString*)dbname
  26. {
  27. self = [super init];
  28. if (self != nil) {
  29. if ([self openOrCreateDatabase:dbname]) {
  30. [self closeDatabase];
  31. }
  32. }
  33. return self;
  34. }
  35. -(id) init
  36. {
  37. NSAssert(0,@"Never Use this.Please Call Use initWithDbName:(NSString*)");
  38. return nil;
  39. }
  40. -(void) dealloc
  41. {
  42. self.m_sql = nil;
  43. self.m_dbName =nil;
  44. [super dealloc];
  45. }
  46. //创建数据库
  47. -(BOOL)openOrCreateDatabase:(NSString*)dbName
  48. {
  49. self.m_dbName = dbName;
  50. NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
  51. NSString *documentsDirectory = [path objectAtIndex:0];
  52. if(sqlite3_open([[documentsDirectorystringByAppendingPathComponent:dbName] UTF8String],&m_sql) !=SQLITE_OK)
  53. {
  54. NSLog(@"创建数据库失败");
  55. return NO;
  56. }
  57. return YES;
  58. }
  59. //关闭数据库
  60. -(void)closeDatabase
  61. {
  62. sqlite3_close(self.m_sql);
  63. }
  64. //创建表
  65. -(BOOL)createTable:(NSString*)sqlCreateTable
  66. {
  67. if (![selfopenOrCreateDatabase:self.m_dbName]) {
  68. return NO;
  69. }
  70. char *errorMsg;
  71. if (sqlite3_exec (self.m_sql, [sqlCreateTable UTF8String],NULL, NULL, &errorMsg) != SQLITE_OK)
  72. {
  73. NSLog(@"创建数据表失败:%s",errorMsg);
  74. return NO;
  75. }
  76. [selfcloseDatabase];
  77. return YES;
  78. }
  79. //插入表
  80. -(BOOL)InsertTable:(NSString*)sqlInsert
  81. {
  82. if (![selfopenOrCreateDatabase:self.m_dbName]) {
  83. return NO;
  84. }
  85. char* errorMsg = NULL;
  86. if(sqlite3_exec(self.m_sql, [sqlInsertUTF8String],0, NULL, &errorMsg) ==SQLITE_OK)
  87. {
  88. [selfcloseDatabase];
  89. returnYES;
  90. }
  91. else
  92. {
  93. printf("更新表失败:%s",errorMsg);
  94. [selfcloseDatabase];
  95. return NO;
  96. }
  97. return YES;
  98. }
  99. //更新表
  100. -(BOOL)UpdataTable:(NSString*)sqlUpdata
  101. {
  102. if (![selfopenOrCreateDatabase:self.m_dbName])
  103. {
  104. return NO;
  105. }
  106. char *errorMsg;
  107. if (sqlite3_exec (self.m_sql, [sqlUpdata UTF8String],0, NULL, &errorMsg) !=SQLITE_OK)
  108. {
  109. [selfcloseDatabase];
  110. returnYES;
  111. }
  112. else
  113. {
  114. returnNO;
  115. }
  116. return YES;
  117. }
  118. //查询表
  119. -(NSArray*)querryTable:(NSString*)sqlQuerry
  120. {
  121. if (![selfopenOrCreateDatabase:self.m_dbName]) {
  122. return nil;
  123. }
  124. int row = 0;
  125. int column = 0;
  126. char*    errorMsg = NULL;
  127. char**    dbResult = NULL;
  128. NSMutableArray*    array = [[NSMutableArrayalloc] init];
  129. if(sqlite3_get_table(m_sql, [sqlQuerryUTF8String], &dbResult, &row,&column,&errorMsg ) == SQLITE_OK)
  130. {
  131. if (0 == row) {
  132. [self closeDatabase];
  133. return nil;
  134. }
  135. int index = column;
  136. for(int i =0; i < row ; i++ ) {
  137. NSMutableDictionary*    dic = [[NSMutableDictionaryalloc] init];
  138. for(int j =0 ; j < column; j++ ) {
  139. if (dbResult[index]) {
  140. NSString*    value = [[NSStringalloc] initWithUTF8String:dbResult[index]];
  141. NSString*    key = [[NSStringalloc] initWithUTF8String:dbResult[j]];
  142. [dic setObject:value forKey:key];
  143. [value release];
  144. [key release];
  145. }
  146. index ++;
  147. }
  148. [array addObject:dic];
  149. [dic release];
  150. }
  151. }else {
  152. printf("%s",errorMsg);
  153. [selfcloseDatabase];
  154. return nil;
  155. }
  156. [selfcloseDatabase];
  157. return [array autorelease];
  158. }
  159. //select
  160. int processData(void* arrayResult,int columnCount,char** columnValue,char** columnName)
  161. {
  162. int i;
  163. NSMutableDictionary* dic = [[NSMutableDictionaryalloc] init];
  164. for( i = 0 ; i < columnCount; i ++ )
  165. {
  166. if (columnValue[i])
  167. {
  168. NSString* key = [[NSStringalloc] initWithUTF8String:columnName[i]];
  169. NSString* value = [[NSStringalloc] initWithUTF8String:columnValue[i]];
  170. [dic setObject:value forKey:key];
  171. }
  172. }
  173. [(NSMutableArray*)arrayResult addObject:dic];
  174. [dic release];
  175. return 0;
  176. }
  177. //select
  178. -(NSArray*)querryTableByCallBack:(NSString*)sqlQuerry
  179. {
  180. if (![selfopenOrCreateDatabase:self.m_dbName])
  181. {
  182. return nil;
  183. }
  184. char*    errorMsg = NULL;
  185. NSMutableArray* arrayResult = [[NSMutableArrayalloc] init];
  186. if (sqlite3_exec(self.m_sql,[sqlQuerryUTF8String],processData,(void*)arrayResult,&errorMsg) !=SQLITE_OK)
  187. {
  188. printf("查询出错:%s",errorMsg);
  189. }
  190. [selfcloseDatabase];
  191. return [arrayResult autorelease];
  192. }
  193. @end
  194. //
  195. /*IOS开发中sqlite数据库的使用方法。
  196. *sqlite数据库初始化,复制到用户目录,并判断是否数据库已经存在,或者复制是否成功;
  197. *在AppDelegate.m中输入以下代码,以便复制预置数据库到指定doucment目录
  198. */
  199. - (BOOL) initializeDb
  200. {
  201. NSLog (@"initializeDB");
  202. NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  203. NSString *documentFolderPath = [searchPaths objectAtIndex: 0];
  204. //查看文件目录
  205. NSLog(@"%@",documentFolderPath);
  206. dbFilePath = [documentFolderPath stringByAppendingPathComponent:@"shopping.db"];
  207. [dbFilePath retain];
  208. if (! [[NSFileManager defaultManager] fileExistsAtPath: dbFilePath])
  209. {
  210. NSString *backupDbPath = [[NSBundle mainBundle] pathForResource:@"shopping" ofType:@"db"];
  211. if (backupDbPath == nil)
  212. {
  213. return NO;
  214. }
  215. else
  216. {
  217. BOOL copiedBackupDb = [[NSFileManager defaultManager] copyItemAtPath:backupDbPath toPath:dbFilePath error:nil];
  218. if (! copiedBackupDb)
  219. {
  220. return NO;
  221. }
  222. }
  223. }
  224. return YES;
  225. }
  226. - (void)applicationDidFinishLaunching:(UIApplication *)application
  227. {
  228. if (! [self initializeDb])
  229. {
  230. NSLog (@"couldn't init db");
  231. return;
  232. }
  233. [window addSubview:tabBarController.view];
  234. }

ios 封装sqllite3接口的更多相关文章

  1. [iOS]封装单例类

    [iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...

  2. Java基础04 封装与接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...

  3. ios 开源免费接口

    ios 开源免费接口 国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather. ...

  4. Java基础04 封装与接口(转载)

    数据成员和方法都是同时开放给内部和外部的.在对象内部,我们利用this来调用对象的数据成员和方法.在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对 ...

  5. java Vamei快速教程04 封装和接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...

  6. QuantLib 金融计算——自己动手封装 Python 接口(1)

    目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 ...

  7. 使用php封装APP接口

    php封装APP接口 我们先来介绍Json的封装方法 json_encode函数传递中文的话,输出后是乱码的,针对这个问题我觉得有必要做一个解释: 其实json_encode对中文那不是乱码,只是js ...

  8. QuantLib 金融计算——自己动手封装 Python 接口(2)

    目录 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 如何封装一项复杂功能? 寻找最小功能集合的策略 实践 估计期限结构参数 修改官方接口文件 下一步的计划 QuantLi ...

  9. Unity3D 与 objective-c 之间数据交互。iOS SDK接口封装Unity3D接口

    原地址:http://www.cnblogs.com/qingjoin/p/3638915.html Unity 3D 简单工程的创建.与Xcode 导出到iOS 平台请看这 Unity3D 学习 创 ...

随机推荐

  1. 洛谷 - P1217 - 回文质数 - 枚举

    https://www.luogu.org/problemnew/show/P1217 考虑暴力生成所有的回文数然后再判断是不是质数.注意个位的选择实际上只有4种.所以是 $4*10^3*10^3=4 ...

  2. SCUT - 261 - 对称与反对称 - 构造 - 简单数论

    https://scut.online/p/261 由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理! 由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理! 由于M不是质数,要用扩展欧几 ...

  3. bzoj 1823: [JSOI2010]满汉全席【2-SAT+tarjan】

    因为每种食材只有一份,所以两个评委的如果有要求同一种食材的两种做法就是不可行,用这个来建立2-SAT模型 然后跑tarjan判可行性即可 #include<iostream> #inclu ...

  4. P5165 xtq的棋盘

    传送门 设\(f[i]\)为\(i\)位置向左走一步的期望时间,那么答案就是\(\sum_{i=1}^mf[i]\) 首先\(f[n]=1\),设\(p\)为向左的概率,对于\(i<n\)的位置 ...

  5. Hue的全局配置文件hue.ini(图文详解)

    Hue版本:hue-3.9.0-cdh5.5.4 需要编译才能使用(联网) 说给大家的话:大家电脑的配置好的话,一定要安装cloudera manager.毕竟是一家人的.同时,我也亲身经历过,会有部 ...

  6. Python基础知识(3)

    1:字符串类型转换 num = 100 num2 = " #num是整数类型的值,num2是字符串类型的值,如果把他们两个的类型转换下呢? int(num2) #int 整形成整数 str( ...

  7. 【loj6034】「雅礼集训 2017 Day2」线段游戏

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...

  8. 洛谷 P1072 Hankson 的趣味题 || 打质数表的分解质因数

    方法就是枚举,根据b0和b1可以大大减小枚举范围,方法类似这个http://blog.csdn.net/hehe_54321/article/details/76021615 将b0和b1都分解质因数 ...

  9. ui自动化测试的意义与理解

    分层测试的思想 分层测试(有的也叫测试金字塔)是最近几年慢慢流行.火热起来的,也逐渐得到了大家的认可,大家应该已经比较熟悉分层测试的思想了,不太了解的可以自行找一些相应的渠道去补充一下上下文的知识. ...

  10. 127 Word Ladder 单词接龙

    给出两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列,转换需遵循如下规则:    每次只能改变一个字母.    变换过程中的 ...