IOS项目练习 之 "爱限免" 项目笔记(二) - 数据库篇

在这个练习项目中我们用到了Sqlite3 数据库,这里使用了第三方开源库FMDB,但是直接操作FMDB太麻烦了,所以又在上面加了一层封装;

为了保证代码的通用性,我写的时候尽量将实体和数据库操作分离,实在没有办法分离的地方就使用预编译命令代替,下面是我的数据库封装的代码

 1 //
 2 //  DatabaseManager.h
 3 //  FreeLimit
 4 //
 5 //  Created by TBXark on 15-4-10.
 6 //  Copyright (c) 2015年 TBXark. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 //实体的类名,当执行Select操作视直接返回实体
12 #define kEntityClassName   @"AppModel"
13
14 //自动增长主键名
15 #define kAutoIncrementKey  @"id"
16
17 //约束键名
18 #define kUniqueKey         @"applicationId"
19 #define kUniqueKeySecond   @"recordType"
20
21 //表的所有列名
22 #define kTableKey          @[@"recordType",23                              @"applicationId",24                              @"name",25                              @"iconUrl",26                              @"type",27                              @"lastPrice",28                              @"currentPrice"];
29
30 //是否阻止约束对象插入
31 #define kCanNotInsertWhenUniqueDefine
32
33 @interface DatabaseManager : NSObject
34
35 @property (nonatomic,strong) NSMutableDictionary *indexDict;
36
37
38 + (instancetype)shareManager;
39
40 - (BOOL)insertIntoTable:(id)model;
41 - (id)selectFromTable:(NSString *)query;
42 - (NSArray *)selectMultFromTable:(NSString *)query;
43 - (BOOL)deleteFromTable:(NSString *)query;
44 - (BOOL)updateFromTable:(NSString *)query entity:(id)model;
45
46 - (NSDictionary *)createIndexForTable;
47
48 #ifndef kUniqueKeySecond
49 - (BOOL)checkExistWithUniqueKey:(NSString *)uniqueKey;
50 #else
51 - (BOOL)checkExistWithUniqueKey:(NSString *)uniqueKey secondKey:(NSString *)secondKey;
52 #endif
53
54 @end
  1 //
  2 //  DatabaseManager.m
  3 //  FreeLimit
  4 //
  5 //  Created by TBXark on 15-4-10.
  6 //  Copyright (c) 2015年 TBXark. All rights reserved.
  7 //
  8
  9 #import "DatabaseManager.h"
 10 #import "FMDatabase.h"
 11 #import "NSObject+EntityHelper.h"
 12
 13 static DatabaseManager *_mainDataBaseManager;
 14
 15 //基本的SQL查询语句
 16
 17 #define kCreateTable       @"create table if not exists applist  ("  18                             " id integer primary key autoincrement not null, "  19                             " recordType varchar(32), "  20                             " applicationId integer not null, "  21                             " name varchar(128), "  22                             " iconUrl varchar(1024), "  23                             " type varchar(32) ,"  24                             " lastPrice integer, "  25                             " currentPrice integer "  26                             ",UNIQUE(applicationId,recordType)"  27                             ");"
 28
 29 #define kInsertIntoTable   @"INSERT INTO applist(" 30                             "recordType,"  31                             "applicationId,"  32                             "name,"  33                             "iconUrl,"  34                             "type,"  35                             "lastPrice,"  36                             "currentPrice) "  37                             "VALUES("  38                             ":recordType,"  39                             ":applicationId,"  40                             ":name,:iconUrl,"  41                             ":type,"  42                             ":lastPrice,"  43                             ":currentPrice "  44                             ");"
 45
 46 #define kUpdateTable       @"UPDATE applist SET "  47                             "recordType = :recordType"  48                             "applicationId = :applicationId,"  49                             "name = :name,"  50                             "iconUrl = :iconUrl,"  51                             "type = :type,"  52                             "lastPrice = :lastPrice,"  53                             "currentPrice = :currentPrice"  54                             "WHERE %@;);"
 55
 56 #define kSelectAll         @"SELECT * FROM applist WHERE %@;"
 57
 58 #define kCreateIndex       @"SELECT id,applicationId,recordType FROM applist;"
 59
 60 #define kDeleteFromTable   @"DELETE FROM applist WHERE %@;"
 61
 62 #define kDataBaseName      @"DataBase.sqlite"
 63
 64
 65 @interface DatabaseManager ()
 66
 67 @property (strong,nonatomic) FMDatabase *db;
 68
 69
 70 @end
 71
 72 @implementation DatabaseManager
 73
 74 + (instancetype)shareManager
 75 {
 76     static dispatch_once_t onceToken;
 77     dispatch_once(&onceToken, ^{
 78         if (_mainDataBaseManager == nil) {
 79             _mainDataBaseManager = [[DatabaseManager alloc] init];
 80             [_mainDataBaseManager createTable];
 81             [_mainDataBaseManager createIndexForTable];
 82         }
 83     });
 84     return _mainDataBaseManager;
 85 }
 86
 87 - (void)createTable
 88 {
 89     NSString *createTableStr = kCreateTable;
 90     NSString *dbPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@",kDataBaseName];
 91     _db = [FMDatabase databaseWithPath:dbPath];
 92     if ([_db open]) {
 93         NSLog(@"Open in path : %@",dbPath);
 94         [_db executeUpdate:createTableStr];
 95         [_db close];
 96     }else
 97     {
 98         NSLog(@"Can not open");
 99         [_db close];
100     }
101 }
102
103 - (BOOL)insertIntoTable:(id)model
104 {
105     NSDictionary *dict = [self createDictFromDict:[model entityToDictionary]];
106
107 #ifdef kCanNotInsertWhenUniqueDefine
108     if ([[_indexDict allValues] containsObject:dict[kUniqueKey]]) {
109         NSLog(@"Can Not Insert Exist Object When Unique Define is Enable");
110         return NO;
111     }
112 #endif
113     if ([_db open]) {
114         [_db executeUpdate:kInsertIntoTable withParameterDictionary:dict];
115         [_db close];
116         [self createIndexForTable];
117         return YES;
118     }
119     return NO;
120 }
121
122 - (id)selectFromTable:(NSString *)query
123 {
124     if ([_db open]) {
125         FMResultSet *set = [_db executeQuery:[NSString stringWithFormat:kSelectAll,query]];
126         NSDictionary *dict;
127         if ([set next]) {
128             dict = [set resultDictionary];
129             if (dict) {
130 //                根据结果集创建实体
131                 id  entity = [[NSClassFromString(kEntityClassName) alloc] init];
132                 [entity setValuesForKeysWithDictionary:dict];
133                 [_db close];
134                 return entity;
135             }
136         }
137     }
138     return nil;
139 }
140
141 - (NSArray *)selectMultFromTable:(NSString *)query
142 {
143     if ([_db open]) {
144         FMResultSet *set = [_db executeQuery:[NSString stringWithFormat:kSelectAll,query]];
145         NSMutableArray *resultArry = [[NSMutableArray alloc] init];
146         NSDictionary *dict;
147         while([set next]) {
148             dict = [set resultDictionary];
149             if (dict) {
150                 id  entity = [[NSClassFromString(kEntityClassName) alloc] init];
151                 [entity setValuesForKeysWithDictionary:dict];
152                 [resultArry addObject:entity];
153             }
154         }
155         [_db close];
156         return resultArry;
157     }
158     return nil;
159 }
160
161 - (BOOL)deleteFromTable:(NSString *)query
162 {
163     if ([_db open]) {
164         BOOL result = [_db executeUpdate:[NSString stringWithFormat:kDeleteFromTable,query]];
165         [self createIndexForTable];
166         return result;
167     }
168     return NO;
169 }
170
171 - (BOOL)updateFromTable:(NSString *)query entity:(id)model
172 {
173     if ([_db open]) {
174         NSDictionary *dict = [self createDictFromDict:[model entityToDictionary]];
175         NSString *updateStr = [NSString stringWithFormat:kUpdateTable,query];
176         BOOL result = [_db executeUpdate:updateStr,dict];
177         [self createIndexForTable];
178         return result;
179     }
180     return NO;
181 }
182
183 - (NSDictionary *)createIndexForTable
184 {
185     if ([_db open]) {
186         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
187         FMResultSet *set = [_db executeQuery:kCreateIndex];
188         while ([set next]) {
189             NSNumber *num = [NSNumber numberWithInteger:[set intForColumn:kAutoIncrementKey]];
190             NSString *uniqueValue = [set stringForColumn:kUniqueKey];
191
192 #ifndef kUniqueKeySecond
193             NSDictionary *dictTemp = @{kUniqueKey:uniqueValue};
194 #else
195             NSString *secondUniqueValue = [set stringForColumn:kUniqueKeySecond];
196             NSDictionary *dictTemp = @{kUniqueKey:uniqueValue,
197                                        kUniqueKeySecond:secondUniqueValue};
198 #endif
199
200             [dict setObject:dictTemp forKey:num];
201         }
202         _indexDict = dict;
203         return dict;
204     }
205     return nil;
206 }
207
208
209 - (NSDictionary *)createDictFromDict:(NSDictionary *)dict
210 {
211     NSArray *keyArry = kTableKey;
212     if (dict[kUniqueKey] == nil) {
213         return nil;
214     }
215     NSMutableDictionary *dictTemp = [[NSMutableDictionary alloc] init];
216      for (NSString *key in keyArry) {
217         NSString *value = dict[key];
218         if (value) {
219             [dictTemp setObject:value forKey:key];
220         }else
221         {
222             [dictTemp setObject:@"NULL" forKey:key];
223         }
224     }
225     return dictTemp;
226 }
227
228
229
230
231 #ifndef kUniqueKeySecond
232 - (BOOL)checkExistWithUniqueKey:(NSString *)uniqueKey
233 {
234     for (NSNumber *key in _indexDict) {
235         NSDictionary *dict = _indexDict[key];
236         if ([dict[kUniqueKey] isEqualToString:uniqueKey]) {
237             return YES;
238         }
239 }
240 return NO;
241 #else
242 - (BOOL)checkExistWithUniqueKey:(NSString *)uniqueKey secondKey:(NSString *)secondKey
243 {
244     for (NSNumber *key in _indexDict) {
245         NSDictionary *dict = _indexDict[key];
246         if ([dict[kUniqueKey] isEqualToString:uniqueKey] &&[dict[kUniqueKeySecond] isEqualToString:secondKey]) {
247             return YES;
248         }
249     }
250     return NO;
251 }
252 #endif
253
254
255
256 @end

写在后面的话:

这个项目大部分的功能和界面已经完成,可以到我的gitHub上查看完整版代码 :https://github.com/vfanx/FreeLimit

时间: 2024-10-25 08:05:16

IOS项目练习 之 "爱限免" 项目笔记(二) - 数据库篇的相关文章

IOS项目练习 之 &quot;爱限免&quot; 项目笔记(一)

TableView 的分解 原本项目页面不是由TableView构成,但是我用tableView比较适合,所以重写了一边, 项目源代码可以从我的gitHub https://github.com/vfanx/FreeLimit上获得,这里我将tableView拆分成三部分 1. DataSource 将DataSource和tableView分离,使其可以复用,抽象出部分接口使其可以定制 在这里,我一个创建了两个DataSource类,下面我贴出这个页面的DataSource类 1 #impor

IOS Core Animation Advanced Techniques的学习笔记(二)

[objc] view plaincopyprint?转载学习 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { CGFloat width = 10.0f; //draw a thick red circle CGContextSetLineWidth(ctx, width); CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor); CG

ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整的学习完所需知识,,其他文件夹的内容如其名说描述一样 没张图片都有文字说明,可以需要该功能的时候搜索一下然后打开图片就可以学习到 网盘下载地址:需要的话给留言我再传上去 http://www.cnblogs.com/langtianya原创 ios学习笔记图片+图片解释(c语言 oc语言 ios控件

ios客户端暑期“动画屋“活动项目总结

    入职实习的这个公司,第一天就分配了任务,从零开始写一个网页,之前虽然了解一些前端知识,但从头开写还是遇到了很多问题,互联网公司讲求效率,有deadline还是比较有紧迫感的,与在实验室放羊状态有了鲜明的对比.mentor.产品经理.组里的boss.实习生同事都给我提供了非常多的帮助.此篇总结为独立完成的第一个项目的项目总结.下图是已上线活动界面效果. 项目介绍 (一).爱奇艺IOS客户端发现-活动页面中"动画屋"活动开始页面的开发     活动开始页面的开发主要需求是:    

ios项目中引用其他开源项目

1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Libraries 引入.a文件.Target Dependencies里引入开源项目文件 3. Build Setting下的 Search Paths 里 Header Search Paths 加入开源项目src目录 例:$(SOURCE_ROOT)/IBAForms/headers ,IBA放在项目根目录里,headers就是src 如果和项目根目录平

iOS超全开源框架、项目和学习资料汇总(3)网络和Model篇

网络连接 1. AFNetworking – ASI不升级以后,最多人用的网络连接开源库,[推荐]iOS网络编程之AFNetworking使用,iOS开发下载文件速度计算. 2. Alamofire – Alamofire是AFNetworking的作者mattt新写的网络请求的swift库. 3. YTKNetwork – 是基于 AFNetworking 封装的 iOS网络库,提供了更高层次的网络访问抽象.相比AFNetworking,YTKNetwork提供了以下更高级的功能:按时间或版本

iOS那些值得参考的App项目源码

iOS那些值得参考的App项目源码 https://cloud.tencent.com/developer/article/1332192 https://github.com/siegrainwong/WeChat iOS工具——Xcode9无证书真机调试 原文地址:https://www.cnblogs.com/kaola8023/p/12145642.html

Java基础学习笔记二十八 管家婆综合项目

本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添加账务 编辑账务 删除账务 项目环境搭建 技术选型和jar包介绍 每个项目都要使用一些已经成熟的技术,它们通常是由一些专业组织或团队所提供的开源免费技术.在今后的学习过程中,我们会逐渐对这些专业组织有所了解.本项目中使用的技术如下: apache的commons组件: commons-dbutils

【项目实战派】图像处理项目硬件选型

[项目实战派]图像处理项目的硬件平台选型 一直以来我都对嵌入式系统比较感兴趣,因为感到图像处理最终还是要走向便携式.移动化的.这里讲自己对图像处理项目的硬件平台选型这块的想法进行交流,欢迎交流.批评. 一.典型图像处理系统构建 ①相机与镜头--这部分属于成像器件,通常的视觉系统都是由一套或者多套这样的成像系统组成,如果有多路相机,可能由图像卡切换来获取图像数据,也可能由同步控制同时获取多相机通道的数据.根据应用的需要相机可能是输出标准的单色视频(RS-170/CCIR).复合信号(Y/C).RG