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. codeforces 632C

    题意: 给n个字符串,然后将这些字符串组合,搞成一个最小字典序的字符串,然后输出就好了. 思路: 记得以前神队友给我说过你怎么将n个字符串按字典序的比较从小到大输出.那么我也是这样玩一下,然后组合输出 ...

  2. python int对象的方法

    1.求绝对值 >>> a = -10 >>> a.__abs__() 10 >>> abs(10) 10 2.加法 >>> a ...

  3. spark 机器学习 朴素贝叶斯 原理(一)

    朴素贝叶斯算法仍然是流行的挖掘算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些领域的分类问题中 ...

  4. hdu1068 Girls and Boys 基础匈牙利

    #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> ...

  5. C++11 多线程相关的头文件

    C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable& ...

  6. Brush (III) LightOJ - 1017

    Brush (III) LightOJ - 1017 题意:有一些点,每刷一次可以将纵坐标在区间(y1,y1+w)范围内的所有点刷光,y1为任何实数.最多能刷k次,求最多共能刷掉几个点. 先将点按照纵 ...

  7. Backbone学习记录(6)

    路由 backbone将路由规则和一个方法名绑定到一起,来控制单页的hash,以及单页的前进后退. var UserRouter = Backbone.Router.extend({ routes: ...

  8. jQuery将json字符串显示在页面上

    js代码: function syntaxHighlight(json) { if (typeof json != 'string') { json = JSON.stringify(json, un ...

  9. AJPFX总结List的三个子类的特点

    ArrayList:                        底层数据结构是数组,查询快,增删慢.                        线程不安全,效率高.              ...

  10. re匹配语法-match、search和findall

    1.re.match() 匹配第一个值 列表里的值可以有多个范围,有一个符合就可以. match只匹配第一个值,所以列表里的范围是第一个值得取值范围.如果第一个值被设定好且存在,那么列表的取值范围变为 ...