SQLiteManager.m 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //
  2. // SQLiteManager.m
  3. // SQLite数据库操作-0C
  4. //
  5. // Created by 邱学伟 on 16/10/24.
  6. // Copyright © 2016年 邱学伟. All rights reserved.
  7. //
  8. #import "SQLiteManager.h"
  9. #import <sqlite3.h>
  10. @interface SQLiteManager ()
  11. @property (nonatomic,assign) sqlite3 *db;
  12. @end
  13. @implementation SQLiteManager
  14. static SQLiteManager *instance;
  15. +(instancetype)shareInstance{
  16. static dispatch_once_t onceToken;
  17. dispatch_once(&onceToken, ^{
  18. instance = [[self alloc] init];
  19. });
  20. return instance;
  21. }
  22. #pragma mark - 打开/创建数据库
  23. -(BOOL)openDB{
  24. //app内数据库文件存放路径-一般存放在沙盒中
  25. NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  26. NSString *DBPath = [documentPath stringByAppendingPathComponent:@"appDB.sqlite"];
  27. //创建(指定路径不存在数据库文件)/打开(已存在数据库文件) 数据库文件
  28. //sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>) filename:数据库路径 ppDb:数据库对象
  29. if (sqlite3_open(DBPath.UTF8String, &_db) != SQLITE_OK) {
  30. //数据库打开失败
  31. return NO;
  32. }else{
  33. //打开成功创建表
  34. return [self creatTable];
  35. }
  36. }
  37. -(void)closeDB{
  38. sqlite3_close(_db);
  39. }
  40. -(BOOL)creatTable{
  41. //创建表的SQL语句
  42. //用户 表
  43. NSString *serviceNoticeTable = @"CREATE TABLE IF NOT EXISTS 'T_Service_Notice' ('ServiceNoticeID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'Content' TEXT,'Time' DATETIME,'ReadFlag' TEXT);";
  44. NSString *messageNoticeTable = @"CREATE TABLE IF NOT EXISTS 'T_Message_Notice' ( 'MessageNoticeID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'NoticeId' INTEGER,'Title' TEXT,'Content' TEXT,'NoticeType' TEXT,'NoticeTypeName' Text,'Remarks'TEXT,'CreateTime' DATETIME,'ReadFlag' TEXT);";
  45. NSArray *SQL_ARR = [NSArray arrayWithObjects:serviceNoticeTable,messageNoticeTable, nil];
  46. return [self creatTableExecSQL:SQL_ARR];
  47. }
  48. -(BOOL)creatTableExecSQL:(NSArray *)SQL_ARR{
  49. for (NSString *SQL in SQL_ARR) {
  50. //参数一:数据库对象 参数二:需要执行的SQL语句 其余参数不需要处理
  51. if (![self execSQL:SQL]) {
  52. return NO;
  53. }
  54. }
  55. return YES;
  56. }
  57. #pragma 执行SQL语句
  58. -(BOOL)execSQL:(NSString *)SQL{
  59. char *error;
  60. if (sqlite3_exec(self.db, SQL.UTF8String, nil, nil, &error) == SQLITE_OK) {
  61. NSLog(@"插入数据成功");
  62. return YES;
  63. }else{
  64. NSLog(@"SQLiteManager执行SQL语句出错:%s",error);
  65. return NO;
  66. }
  67. }
  68. #pragma mark - 查询数据库中数据
  69. -(NSArray *)querySQL:(NSString *)SQL{
  70. //准备查询
  71. // 1> 参数一:数据库对象
  72. // 2> 参数二:查询语句
  73. // 3> 参数三:查询语句的长度:-1
  74. // 4> 参数四:句柄(游标对象)
  75. // sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
  76. sqlite3_stmt *stmt = nil;
  77. if (sqlite3_prepare_v2(self.db, SQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
  78. NSLog(@"准备查询失败!");
  79. return NULL;
  80. }
  81. //准备成功,开始查询数据
  82. //定义一个存放数据字典的可变数组
  83. NSMutableArray *dictArrM = [[NSMutableArray alloc] init];
  84. while (sqlite3_step(stmt) == SQLITE_ROW) {
  85. //一共获取表中所有列数(字段数)
  86. int columnCount = sqlite3_column_count(stmt);
  87. //定义存放字段数据的字典
  88. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  89. for (int i = 0; i < columnCount; i++) {
  90. // 取出i位置列的字段名,作为字典的键key
  91. const char *cKey = sqlite3_column_name(stmt, i);
  92. NSString *key = [NSString stringWithUTF8String:cKey];
  93. //取出i位置存储的值,作为字典的值value
  94. const char *cValue = (const char *)sqlite3_column_text(stmt, i);
  95. NSString *value = [NSString stringWithUTF8String:cValue];
  96. //将此行数据 中此字段中key和value包装成 字典
  97. [dict setObject:value forKey:key];
  98. }
  99. [dictArrM addObject:dict];
  100. }
  101. return dictArrM;
  102. }
  103. @end