├── .gitignore ├── .swift-version ├── .travis.yml ├── DDSqliteManager.podspec ├── LICENSE ├── README.md └── SqliteSpec ├── Assets └── .gitkeep └── Classes ├── .gitkeep ├── DDDBSearchHisManager.h ├── DDDBSearchHisManager.m ├── DDNSObject+Ext.h └── DDNSObject+Ext.m /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | Carthage 26 | # We recommend against adding the Pods directory to your .gitignore. However 27 | # you should judge for yourself, the pros and cons are mentioned at: 28 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 29 | # 30 | # Note: if you ignore the Pods directory, make sure to uncomment 31 | # `pod install` in .travis.yml 32 | # 33 | # Pods/ 34 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 2.3 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * http://www.objc.io/issue-6/travis-ci.html 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -workspace Example/SqliteSpec.xcworkspace -scheme SqliteSpec-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /DDSqliteManager.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint SqliteSpec.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'DDSqliteManager' 11 | s.version = '1.5.0' 12 | s.summary = 'FMDB Manager' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | TODO: Add long description of the pod here. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/DDstrongman/SqliteManager' 25 | s.license = { :type => 'MIT', :file => 'LICENSE' } 26 | s.author = { 'DDStrongman' => 'lishengshu232@gmail.com' } 27 | s.source = { :git => 'https://github.com/DDstrongman/SqliteManager.git', :tag => s.version.to_s } 28 | 29 | s.ios.deployment_target = '8.0' 30 | 31 | s.source_files = 'SqliteSpec/Classes/**/*' 32 | s.dependency 'FMDB' 33 | s.dependency 'MJExtension' 34 | end 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 DDStrongman 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SqliteManager 2 | 3 | 4 | ## Example 5 | 6 | 对于FMDB增删改查的所有方法的封装,同时支持单线程和多线程方法(queue后缀)。
只需要传入**NSDictionary**或**Class**即可完成所有的增删改查工作。
7 | **不必再自己写SQL,详细使用方法请参考.h文件,好用请给star,不好用欢迎提建议~**
8 | 栗子时间:
9 | ``` 10 | /** 11 | 另起线程根据模型添加数据入库,重复情况delegate返回失败,delegate通知异步处理结果 12 | 13 | @param tName 表名 14 | @param dataClass 数据的模型类 15 | */ 16 | - (void)insertTableObjQueue:(NSString *)tName 17 | DataModel:(Class)dataClass 18 | ``` 19 | 20 | ## Installation 21 | 22 | SqliteManager is available through [CocoaPods](http://cocoapods.org). To install 23 | it, simply add the following line to your Podfile: 24 | 25 | ```ruby 26 | pod "DDSqliteManager" 27 | ``` 28 | 29 | ## Author 30 | 31 | DDStrongman, lishengshu232@gmail.com 32 | 33 | ## License 34 | 35 | SqliteManager is available under the MIT license. See the LICENSE file for more info. 36 | -------------------------------------------------------------------------------- /SqliteSpec/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDstrongman/SqliteManager/dda68e1f6ad243e884c384d8a05cf0f7bd769650/SqliteSpec/Assets/.gitkeep -------------------------------------------------------------------------------- /SqliteSpec/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DDstrongman/SqliteManager/dda68e1f6ad243e884c384d8a05cf0f7bd769650/SqliteSpec/Classes/.gitkeep -------------------------------------------------------------------------------- /SqliteSpec/Classes/DDDBSearchHisManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // DDDBManager.h 3 | // YZDoctors 4 | // 5 | // Created by lishengshu on 15-7-29. 6 | // Copyright (c) 2015年 李胜书. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol DDDBManagerDelegate 13 | 14 | @optional 15 | /** 16 | 异步表创建或直接使用查询的结果 17 | 18 | @param result 异步的表结果 19 | @param tName 此结果的表名 20 | */ 21 | - (void)tableReadyResult:(BOOL)result 22 | tName:(NSString *)tName; 23 | /** 24 | 异步表插入的结果 25 | 26 | @param result 插入结果 27 | @param tName 表名 28 | @param dataDic 数据的字典 29 | */ 30 | - (void)tableInsertResult:(BOOL)result 31 | tName:(NSString *)tName 32 | dataDic:(NSDictionary *)dataDic; 33 | /** 34 | 异步搜索返回结果 35 | 36 | @param result 返回搜索结果 37 | @param tName 表名 38 | @param dataDic 数据的字典 39 | */ 40 | - (void)tableSearchResult:(id)result 41 | tName:(NSString *)tName 42 | dataDic:(NSDictionary *)dataDic; 43 | /** 44 | 异步搜索返回结果 45 | 46 | @param result 返回更新结果 47 | @param tName 表名 48 | @param search 更新数据的条件字典或条件类 49 | @param data 更新数据的字典或类 50 | */ 51 | - (void)tableUpdateResult:(BOOL)result 52 | tName:(NSString *)tName 53 | search:(id)search 54 | dataDic:(id)data; 55 | /** 56 | 异步删除返回表结果 57 | 58 | @param result 返回删除表结果 59 | @param tName 删除的表名 60 | */ 61 | - (void)tableDeleteResult:(BOOL)result 62 | tName:(NSString *)tName; 63 | /** 64 | 异步关闭数据库结果 65 | 66 | @param result 关闭数据库的结果 67 | @param dbName 关闭的db的名字 68 | */ 69 | - (void)dbCloseResult:(BOOL)result 70 | dbName:(NSString *)dbName; 71 | 72 | @end; 73 | 74 | @interface DDDBSearchHisManager : NSObject 75 | 76 | /** 77 | 单实例化 78 | 79 | @return 返回生成的单实例 80 | */ 81 | + (DDDBSearchHisManager *)ShareInstance; 82 | 83 | @property (nonatomic,strong) FMDatabase *searchHisDB; 84 | 85 | #pragma mark - 数据库创建,表创建------------------------|*|*|*|*|*| 86 | /** 87 | 创建数据库的函数,利用FMDB的SQL语句创造本地数据库 88 | 89 | @param dbName 本地数据库名 90 | @return 返回是否成功的bool 91 | */ 92 | - (BOOL)creatDatabase:(NSString *)dbName; 93 | /** 94 | 查询数据库是否打开 95 | 96 | @return 返回结果 97 | */ 98 | - (BOOL)isDBReady; 99 | /** 100 | 检查本地数据库表是否存在,如不存在,以数组作为键名建表,默认主键名为key,NSInteger类型自增长 101 | 102 | @param tName 表名 103 | @param keyArr 数据库参数数组 104 | @return 返回是否成功的bool 105 | */ 106 | - (BOOL)isTableExist:(NSString *)tName 107 | tKeyArr:(NSArray *)keyArr; 108 | /** 109 | 检查本地数据库表是否存在,如不存在,以数组作为键名建表,默认主键名为key,NSInteger类型自增长 110 | 111 | @param tName 表名 112 | @param tableClass 数据库参数模型 113 | @return 返回是否成功的bool 114 | */ 115 | - (BOOL)isTableExist:(NSString *)tName 116 | tModel:(Class)tableClass; 117 | 118 | /** 119 | 另起线程检查本地数据库表是否存在,如不存在,以数组作为键名建表,默认主键名为key,NSInteger类型自增长,通过delegate通知异步处理结果 120 | 121 | @param tName 表名 122 | @param keyArr 表结构 123 | */ 124 | - (void)isTableExistQueue:(NSString *)tName 125 | tKeyArr:(NSArray *)keyArr; 126 | /** 127 | 另起线程检查本地数据库表是否存在,如不存在,以数组作为键名建表,默认主键名为key,NSInteger类型自增长,通过block通知异步处理结果 128 | 129 | @param tName 表名 130 | @param keyArr 表结构 131 | @param resultBlock 创建成功后block 132 | */ 133 | - (void)isTableExistQueue:(NSString *)tName 134 | tKeyArr:(NSArray *)keyArr 135 | result:(void(^)(BOOL result))resultBlock; 136 | 137 | /** 138 | 另起线程检查本地数据库表是否存在,如不存在,以传入的Model模型作为键名建表,默认主键名为key,NSInteger类型自增长,通过delegate通知异步处理结果 139 | 140 | @param tName 表名 141 | @param tableClass 模型类 142 | */ 143 | - (void)isTableExistQueue:(NSString *)tName 144 | tModel:(Class)tableClass; 145 | 146 | /** 147 | 另起线程检查本地数据库表是否存在,如不存在,以传入的Model模型作为键名建表,默认主键名为key,NSInteger类型自增长,通过block通知异步处理结果 148 | 149 | @param tName 表名 150 | @param tableClass 模型 151 | @param resultBlock 创建成功后block 152 | */ 153 | - (void)isTableExistQueue:(NSString *)tName 154 | tModel:(Class)tableClass 155 | result:(void(^)(BOOL result))resultBlock; 156 | #pragma mark - 数据库插入更新操作------------------------|*|*|*|*|*| 157 | /** 158 | 根据字典添加数据入库,如果不存在,则新增,如果已存在,返回no 159 | 160 | @param tName 表名 161 | @param dataDic 数据的字典 162 | @return 返回结果bool,成功与否 163 | */ 164 | - (BOOL)insertTableObj:(NSString *)tName 165 | dataDic:(NSDictionary *)dataDic; 166 | /** 167 | 根据字典添加数据入库,如果不存在,则新增,如果已存在,返回no 168 | 169 | @param tName 表名 170 | @param dataClass 数据的模型类 171 | @return 返回结果bool,成功与否 172 | */ 173 | - (BOOL)insertTableObj:(NSString *)tName 174 | dataModel:(NSObject *)dataClass; 175 | /** 176 | 根据字典添加数据入库,直接新增,不管重复 177 | 178 | @param tName 表名 179 | @param dataDic 数据的字典 180 | @return 返回结果bool,成功与否 181 | */ 182 | - (BOOL)directInsertTableObj:(NSString *)tName 183 | dataDic:(NSDictionary *)dataDic; 184 | /** 185 | 根据模型添加数据入库,直接新增,不管重复 186 | 187 | @param tName 表名 188 | @param dataClass 数据的模型类 189 | @return 返回结果bool,成功与否 190 | */ 191 | - (BOOL)directInsertTableObj:(NSString *)tName 192 | dataModel:(NSObject *)dataClass; 193 | /** 194 | 另起线程根据字典直接添加数据入库,不考虑重复情况,delegate通知异步处理结果 195 | 196 | @param tName 表名 197 | @param dataDic 字典名 198 | */ 199 | - (void)directInsertTableObjQueue:(NSString *)tName 200 | dataDic:(NSDictionary *)dataDic; 201 | /** 202 | 另起线程根据字典直接添加数据入库,不考虑重复情况,block通知异步处理结果 203 | 204 | @param tName 表名 205 | @param dataDic 字典名 206 | @param resultBlock 插入结果block 207 | */ 208 | - (void)directInsertTableObjQueue:(NSString *)tName 209 | dataDic:(NSDictionary *)dataDic 210 | result:(void(^)(BOOL result))resultBlock; 211 | /** 212 | 另起线程根据字典直接添加数据入库,不考虑重复情况,delegate通知异步处理结果 213 | 214 | @param tName 表名 215 | @param dataClass 数据的模型类 216 | */ 217 | - (void)directInsertTableObjQueue:(NSString *)tName 218 | dataModel:(NSObject *)dataClass; 219 | /** 220 | 另起线程根据字典直接添加数据入库,不考虑重复情况,block通知异步处理结果 221 | 222 | @param tName 表名 223 | @param dataClass 数据的模型类 224 | @param resultBlock 插入结果block 225 | */ 226 | - (void)directInsertTableObjQueue:(NSString *)tName 227 | dataModel:(NSObject *)dataClass 228 | result:(void(^)(BOOL result))resultBlock; 229 | /** 230 | 根据字典直接添加数据入库,如果不存在,则新增,如果已存在,delegate返回失败,另起线程 231 | 232 | @param tName 表名 233 | @param dataDic 字典名 234 | */ 235 | - (void)insertTableObjQueue:(NSString *)tName 236 | dataDic:(NSDictionary *)dataDic; 237 | /** 238 | 根据字典,另起线程添加数据入库,如果不存在,则新增,如果已存在,返回失败,block处理 239 | 240 | @param tName 表名 241 | @param dataDic 字典名 242 | @param resultBlock 插入结果block 243 | */ 244 | - (void)insertTableObjQueue:(NSString *)tName 245 | dataDic:(NSDictionary *)dataDic 246 | result:(void(^)(BOOL result))resultBlock; 247 | /** 248 | 另起线程根据字典添加数据入库,重复情况delegate返回失败,delegate通知异步处理结果 249 | 250 | @param tName 表名 251 | @param dataClass 数据的模型类 252 | */ 253 | - (void)insertTableObjQueue:(NSString *)tName 254 | dataModel:(NSObject *)dataClass; 255 | /** 256 | 另起线程根据字典添加数据入库,重复情况block返回失败,block通知异步处理结果 257 | 258 | @param tName 表名 259 | @param dataClass 数据的模型类 260 | @param resultBlock 插入结果block 261 | */ 262 | - (void)insertTableObjQueue:(NSString *)tName 263 | dataModel:(NSObject *)dataClass 264 | result:(void(^)(BOOL result))resultBlock; 265 | #pragma mark - 数据库查询操作------------------------|*|*|*|*|*| 266 | /** 267 | 通过字典获取某一表的某一项的记录 268 | 269 | @param tName 表名 270 | @param searchDic 搜索的条件字典 271 | @return 返回 272 | */ 273 | - (FMResultSet *)searchOne:(NSString *)tName 274 | searchDic:(NSDictionary *)searchDic; 275 | /** 276 | 通过模型获取某一表的某一项的记录 277 | 278 | @param tName 表名 279 | @param searchClass 搜索的条件model 280 | @return 返回 281 | */ 282 | - (FMResultSet *)searchOne:(NSString *)tName 283 | searchModel:(NSObject *)searchClass; 284 | /** 285 | 异步获取某一表的某一项的记录,delegate通知返回 286 | 287 | @param tName 表名 288 | @param searchDic 搜索的条件字典 289 | */ 290 | - (void)searchOneQueue:(NSString *)tName 291 | searchDic:(NSDictionary *)searchDic; 292 | /** 293 | 异步获取某一表的某一项的记录,block通知返回 294 | 295 | @param tName 表名 296 | @param searchDic 搜索的条件字典 297 | @param resultBlock 插入结果block 298 | */ 299 | - (void)searchOneQueue:(NSString *)tName 300 | searchDic:(NSDictionary *)searchDic 301 | result:(void(^)(id result))resultBlock; 302 | /** 303 | 通过模型获取某一表的某一项的记录,delegate通知返回 304 | 305 | @param tName 表名 306 | @param searchClass 搜索的条件model 307 | */ 308 | - (void)searchOneQueue:(NSString *)tName 309 | searchModel:(NSObject *)searchClass; 310 | /** 311 | 通过模型获取某一表的某一项的记录,block通知返回 312 | 313 | @param tName 表名 314 | @param searchClass 搜索的条件model 315 | @param resultBlock 插入结果block 316 | */ 317 | - (void)searchOneQueue:(NSString *)tName 318 | searchModel:(Class)searchClass 319 | result:(void(^)(id result))resultBlock; 320 | /** 321 | 返回某一表的最后number行记录 322 | 323 | @param tName 表名 324 | @param number 最后多少行 325 | @return 返回的记录 326 | */ 327 | - (FMResultSet *)searchLastNumber:(NSString *)tName 328 | number:(long)number; 329 | /** 330 | 异步返回某一表的最后number行记录,delegate返回结果 331 | 332 | @param tName 表名 333 | @param number 最后多少行 334 | */ 335 | - (void)searchLastNumberQueue:(NSString *)tName 336 | number:(long)number; 337 | /** 338 | 异步返回某一表的最后number行记录,block返回结果 339 | 340 | @param tName 表名 341 | @param number 最后多少行 342 | @param resultBlock 插入结果block 343 | */ 344 | - (void)searchLastNumberQueue:(NSString *)tName 345 | number:(long)number 346 | result:(void(^)(id result))resultBlock; 347 | /** 348 | 搜索并返回某一表的所有字段数值 349 | 350 | @param tName 要获取的表名 351 | @return 返回的FMDB的特有格式数组 352 | */ 353 | - (FMResultSet *)searchAll:(NSString *)tName; 354 | /** 355 | 异步搜索并返回某一表的所有字段数值,delegate返回结果 356 | 357 | @param tName 要获取的表名 358 | */ 359 | - (void)searchAllQueue:(NSString *)tName; 360 | /** 361 | 异步搜索并返回某一表的所有字段数值,block返回结果 362 | 363 | @param tName 要获取的表名 364 | @param resultBlock result block 365 | */ 366 | - (void)searchAllQueue:(NSString *)tName 367 | result:(void(^)(FMResultSet *result))resultBlock; 368 | /** 369 | 获取当前打开的本地数据库的所有表名,返回数组 370 | 371 | @return 返回的表名数组 372 | */ 373 | - (NSMutableArray *)searchAllTableName; 374 | /** 375 | 异步获取当前打开的本地数据库的所有表名,delegate返回结果 376 | */ 377 | - (void)searchAllTableNameQueue; 378 | /** 379 | 异步获取当前打开的本地数据库的所有表名,block返回结果 380 | */ 381 | - (void)searchAllTableNameQueue:(void(^)(NSMutableArray *result))resultBlock; 382 | #pragma mark - 数据库更新操作------------------------|*|*|*|*|*| 383 | /** 384 | 根据搜索字典更新数据库,如果不存在,返回no 385 | 386 | @param tName 表名 387 | @param searchDic 更新数据的条件字典 388 | @param dataDic 数据的字典 389 | @return 返回结果bool,成功与否 390 | */ 391 | - (BOOL)updateTableObj:(NSString *)tName 392 | searchDic:(NSDictionary *)searchDic 393 | dataDic:(NSDictionary *)dataDic; 394 | /** 395 | 根据搜索模型更新数据库,如果不存在,返回no 396 | 397 | @param tName 表名 398 | @param searchClass 更新数据的条件模型类 399 | @param dataClass 数据的模型类 400 | @return 返回结果bool,成功与否 401 | */ 402 | - (BOOL)updateTableObj:(NSString *)tName 403 | searchModel:(NSObject *)searchClass 404 | dataModel:(NSObject *)dataClass; 405 | /** 406 | 异步根据搜索字典更新数据,如果不存在,返回no,通过delegate返回结果 407 | 408 | @param tName 表名 409 | @param searchDic 更新数据的条件字典 410 | @param dataDic 数据的模型类 411 | */ 412 | - (void)updateTableObjQueue:(NSString *)tName 413 | searchDic:(NSDictionary *)searchDic 414 | dataDic:(NSDictionary *)dataDic; 415 | /** 416 | 异步根据搜索字典更新数据,如果不存在,返回no,通过block返回结果 417 | 418 | @param tName 表名 419 | @param searchDic 更新数据的条件字典 420 | @param dataDic 数据的模型类 421 | @param resultBlock result block 422 | */ 423 | - (void)updateTableObjQueue:(NSString *)tName 424 | searchDic:(NSDictionary *)searchDic 425 | dataDic:(NSDictionary *)dataDic 426 | result:(void(^)(BOOL result))resultBlock; 427 | /** 428 | 异步根据搜索模型更新数据入库,如果不存在,返回no,通过delegate返回结果 429 | 430 | @param tName 表名 431 | @param searchClass 更新数据的条件模型类 432 | @param dataClass 数据的模型类 433 | */ 434 | - (void)updateTableObjQueue:(NSString *)tName 435 | searchModel:(NSObject *)searchClass 436 | dataModel:(NSObject *)dataClass; 437 | /** 438 | 异步根据搜索模型更新数据入库,如果不存在,返回no,通过block返回结果 439 | 440 | @param tName 表名 441 | @param searchClass 更新数据的条件模型类 442 | @param dataClass 数据的模型类 443 | @param resultBlock result block 444 | */ 445 | - (void)updateTableObjQueue:(NSString *)tName 446 | searchModel:(NSObject *)searchClass 447 | dataModel:(NSObject *)dataClass 448 | result:(void(^)(BOOL result))resultBlock; 449 | #pragma mark - 数据库删除操作------------------------|*|*|*|*|*| 450 | /** 451 | 删除表 452 | 453 | @param tName 删除的表名 454 | @return 删除结果 455 | */ 456 | - (BOOL)deleteTable:(NSString *)tName; 457 | /** 458 | 异步删除表,delegate返回结果 459 | 460 | @param tName 删除的表名 461 | */ 462 | - (void)deleteTableQueue:(NSString *)tName; 463 | /** 464 | 异步删除表,block返回结果 465 | 466 | @param tName 删除的表名 467 | @param resultBlock result block 468 | */ 469 | - (void)deleteTableQueue:(NSString *)tName 470 | result:(void(^)(BOOL result))resultBlock; 471 | /** 472 | 根据数据库某一字段删除某一条记录 473 | 474 | @param tName 要删除的表名 475 | @param deleteDic 要删除的条件字典 476 | @return 返回删除结果 477 | */ 478 | - (BOOL)deleTableOjb:(NSString *)tName 479 | deleteDic:(NSDictionary *)deleteDic; 480 | /** 481 | 根据数据库某一字段异步删除某一条记录,delegate返回结果 482 | 483 | @param tName 要删除的表名 484 | @param deleteDic 要删除的条件字典 485 | */ 486 | - (void)deleTableOjbQueue:(NSString *)tName 487 | deleteDic:(NSDictionary *)deleteDic; 488 | /** 489 | 根据数据库某一字段异步删除某一条记录,block返回结果 490 | 491 | @param tName 要删除的表名 492 | @param deleteDic 要删除的条件字典 493 | @param resultBlock result block 494 | */ 495 | - (void)deleTableOjbQueue:(NSString *)tName 496 | deleteDic:(NSDictionary *)deleteDic 497 | result:(void(^)(BOOL result))resultBlock; 498 | #pragma mark - 关闭数据库------------------------|*|*|*|*|*| 499 | /** 500 | 关闭数据库 501 | */ 502 | - (BOOL)closeDB; 503 | /** 504 | 异步关闭数据库,通过delegate返回关闭结果 505 | */ 506 | - (void)closeDBQueue; 507 | /** 508 | 异步关闭数据库,通过block返回关闭结果 509 | 510 | @param resultBlock result block 511 | */ 512 | - (void)closeDBQueue:(void(^)(BOOL result))resultBlock; 513 | 514 | 515 | 516 | @end 517 | -------------------------------------------------------------------------------- /SqliteSpec/Classes/DDDBSearchHisManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // DDDBManager.h 3 | // YZDoctors 4 | // 5 | // Created by lishengshu on 15-7-29. 6 | // Copyright (c) 2015年 李胜书. All rights reserved. 7 | // 8 | 9 | #import "DDDBSearchHisManager.h" 10 | #import "DDNSObject+Ext.h" 11 | #import 12 | 13 | #import "MJExtension.h" 14 | 15 | #define DDWS(weakSelf) __weak __typeof(&*self)weakSelf = self; 16 | #define DDSS(strongSelf) __strong __typeof(weakSelf)strongSelf = weakSelf; 17 | 18 | @interface DDDBSearchHisManager () 19 | 20 | { 21 | NSString *dbPath;///< 数据库存储路径 22 | NSString *dbCName;///< 当前db的名字 23 | FMDatabaseQueue *dbQueue;///< 使用多线程操作 24 | } 25 | 26 | @property (nonatomic,weak) id delegate; 27 | 28 | @end; 29 | 30 | @implementation DDDBSearchHisManager 31 | 32 | struct { 33 | unsigned int tableReadyResult:1; 34 | unsigned int tableInsertResult:1; 35 | unsigned int tableSearchResult:1; 36 | unsigned int tableUpdateResult:1; 37 | unsigned int tableDeleteResult:1; 38 | unsigned int dbCloseResult:1; 39 | } delegateRespondsTo; 40 | 41 | + (DDDBSearchHisManager *)ShareInstance{ 42 | static DDDBSearchHisManager *sharedDBManagerInstance = nil; 43 | static dispatch_once_t predicate; 44 | dispatch_once(&predicate, ^{ 45 | sharedDBManagerInstance = [[self alloc] init]; 46 | }); 47 | return sharedDBManagerInstance; 48 | } 49 | #pragma mark - 创建并打开数据库------------------------|*|*|*|*|*| 50 | - (BOOL)creatDatabase:(NSString *)dbName { 51 | NSString *docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 52 | dbPath = [docsdir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite",dbName]]; 53 | dbCName = dbName; 54 | self.searchHisDB = [FMDatabase databaseWithPath:dbPath]; 55 | //为数据库设置缓存,提高查询效率 56 | [self.searchHisDB setShouldCacheStatements:YES]; 57 | return [self.searchHisDB open]; 58 | } 59 | 60 | - (BOOL)isDBReady { 61 | if(!self.searchHisDB) { 62 | return NO; 63 | } 64 | if (![self.searchHisDB open]) { 65 | return NO; 66 | } 67 | return YES; 68 | } 69 | #pragma mark - 判断表是否存在,不存在则创建表------------------------|*|*|*|*|*| 70 | - (BOOL)isTableExist:(NSString *)tName 71 | tKeyArr:(NSArray *)keyArr { 72 | if (![self isDBReady]) 73 | return NO; 74 | if(![self.searchHisDB tableExists:tName]) { 75 | __block NSString *tempSql = @"(ddkey INTEGER PRIMARY KEY AUTOINCREMENT"; 76 | [keyArr enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) { 77 | if(idx < keyArr.count - 1) { 78 | tempSql = [NSString stringWithFormat:@"%@,%@ TEXT",tempSql,obj]; 79 | }else { 80 | tempSql = [NSString stringWithFormat:@"%@,%@ TEXT)",tempSql,obj]; 81 | } 82 | }]; 83 | NSString *sql = [NSString stringWithFormat:@"create table %@%@",tName,tempSql]; 84 | return [self.searchHisDB executeUpdate:sql]; 85 | }else { 86 | return YES; 87 | } 88 | } 89 | 90 | - (BOOL)isTableExist:(NSString *)tName 91 | tModel:(Class)tableClass { 92 | NSArray *proArr = [self getAllPropertiesNameArr:tableClass]; 93 | return [self isTableExist:tName 94 | tKeyArr:proArr]; 95 | } 96 | 97 | - (void)isTableExistQueue:(NSString *)tName 98 | tKeyArr:(NSArray *)keyArr { 99 | if (!dbQueue) { 100 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 101 | } 102 | DDWS(weakSelf) 103 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 104 | if (db && [db open]) { 105 | if(![db tableExists:tName]) { 106 | __block NSString *tempSql = @"(ddkey INTEGER PRIMARY KEY AUTOINCREMENT"; 107 | [keyArr enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) { 108 | if(idx < keyArr.count - 1) { 109 | tempSql = [NSString stringWithFormat:@"%@,%@ TEXT",tempSql,obj]; 110 | }else { 111 | tempSql = [NSString stringWithFormat:@"%@,%@ TEXT)",tempSql,obj]; 112 | } 113 | }]; 114 | NSString *sql = [NSString stringWithFormat:@"create table %@%@",tName,tempSql]; 115 | BOOL result = [db executeUpdate:sql]; 116 | if (delegateRespondsTo.tableReadyResult) { 117 | [weakSelf.delegate tableReadyResult:result 118 | tName:tName]; 119 | } 120 | }else { 121 | if (delegateRespondsTo.tableReadyResult) { 122 | [weakSelf.delegate tableReadyResult:YES 123 | tName:tName]; 124 | } 125 | } 126 | }else { 127 | if (delegateRespondsTo.tableReadyResult) { 128 | [weakSelf.delegate tableReadyResult:NO 129 | tName:tName]; 130 | } 131 | } 132 | }]; 133 | } 134 | 135 | - (void)isTableExistQueue:(NSString *)tName 136 | tKeyArr:(NSArray *)keyArr 137 | result:(void(^)(BOOL result))resultBlock { 138 | if (!dbQueue) { 139 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 140 | } 141 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 142 | if (db && [db open]) { 143 | if(![db tableExists:tName]) { 144 | __block NSString *tempSql = @"(ddkey INTEGER PRIMARY KEY AUTOINCREMENT"; 145 | [keyArr enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) { 146 | if(idx < keyArr.count - 1) { 147 | tempSql = [NSString stringWithFormat:@"%@,%@ TEXT",tempSql,obj]; 148 | }else { 149 | tempSql = [NSString stringWithFormat:@"%@,%@ TEXT)",tempSql,obj]; 150 | } 151 | }]; 152 | NSString *sql = [NSString stringWithFormat:@"create table %@%@",tName,tempSql]; 153 | BOOL result = [db executeUpdate:sql]; 154 | if (resultBlock) { 155 | resultBlock(result); 156 | } 157 | }else { 158 | if (resultBlock) { 159 | resultBlock(YES); 160 | } 161 | } 162 | }else { 163 | if (resultBlock) { 164 | resultBlock(NO); 165 | } 166 | } 167 | }]; 168 | } 169 | 170 | - (void)isTableExistQueue:(NSString *)tName 171 | tModel:(Class)tableClass { 172 | NSArray *proArr = [self getAllPropertiesNameArr:tableClass]; 173 | [self isTableExistQueue:tName 174 | tKeyArr:proArr]; 175 | } 176 | 177 | - (void)isTableExistQueue:(NSString *)tName 178 | tModel:(Class)tableClass 179 | result:(void(^)(BOOL result))resultBlock { 180 | NSArray *proArr = [self getAllPropertiesNameArr:tableClass]; 181 | [self isTableExistQueue:tName 182 | tKeyArr:proArr 183 | result:resultBlock]; 184 | } 185 | #pragma mark - 插入列表 或者更新------------------------|*|*|*|*|*| 186 | - (BOOL)insertTableObj:(NSString *)tName 187 | dataDic:(NSDictionary *)dataDic { 188 | NSArray *keyArr = [dataDic allKeys]; 189 | if ([self.searchHisDB tableExists:tName]) { 190 | if (keyArr.count > 0) { 191 | FMResultSet *searchResult = [self searchOne:tName 192 | searchDic:dataDic]; 193 | if (![searchResult next]) { 194 | NSString *insertsql = [self insertSQL:tName 195 | dataDic:dataDic]; 196 | return [self.searchHisDB executeUpdate:insertsql]; 197 | } 198 | } 199 | } 200 | return NO; 201 | } 202 | 203 | - (BOOL)insertTableObj:(NSString *)tName 204 | dataModel:(NSObject *)dataClass { 205 | return [self insertTableObj:tName 206 | dataDic:dataClass.mj_keyValues]; 207 | } 208 | 209 | - (BOOL)directInsertTableObj:(NSString *)tName 210 | dataDic:(NSDictionary *)dataDic { 211 | NSArray *keyArr = [dataDic allKeys]; 212 | if ([self.searchHisDB tableExists:tName]) { 213 | if (keyArr.count > 0) { 214 | NSString *insertsql = [self insertSQL:tName 215 | dataDic:dataDic]; 216 | return [self.searchHisDB executeUpdate:insertsql]; 217 | } 218 | } 219 | return NO; 220 | } 221 | 222 | - (BOOL)directInsertTableObj:(NSString *)tName 223 | dataModel:(NSObject *)dataClass { 224 | return [self directInsertTableObj:tName 225 | dataDic:dataClass.mj_keyValues]; 226 | } 227 | 228 | - (void)directInsertTableObjQueue:(NSString *)tName 229 | dataDic:(NSDictionary *)dataDic { 230 | NSArray *keyArr = [dataDic allKeys]; 231 | if (!dbQueue) { 232 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 233 | } 234 | DDWS(weakSelf) 235 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 236 | if ([db tableExists:tName]) { 237 | if (keyArr.count > 0) { 238 | DDSS(strongSelf) 239 | NSString *insertsql = [strongSelf insertSQL:tName 240 | dataDic:dataDic]; 241 | if (delegateRespondsTo.tableInsertResult) { 242 | [weakSelf.delegate tableInsertResult:[db executeUpdate:insertsql] 243 | tName:tName 244 | dataDic:dataDic]; 245 | }else { 246 | [db executeUpdate:insertsql]; 247 | } 248 | }else { 249 | if (delegateRespondsTo.tableInsertResult) { 250 | [weakSelf.delegate tableInsertResult:NO 251 | tName:tName 252 | dataDic:dataDic]; 253 | } 254 | } 255 | }else { 256 | if (delegateRespondsTo.tableInsertResult) { 257 | [weakSelf.delegate tableInsertResult:NO 258 | tName:tName 259 | dataDic:dataDic]; 260 | } 261 | } 262 | }]; 263 | } 264 | 265 | - (void)directInsertTableObjQueue:(NSString *)tName 266 | dataDic:(NSDictionary *)dataDic 267 | result:(void(^)(BOOL result))resultBlock { 268 | NSArray *keyArr = [dataDic allKeys]; 269 | if (!dbQueue) { 270 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 271 | } 272 | DDWS(weakSelf) 273 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 274 | if ([db tableExists:tName]) { 275 | if (keyArr.count > 0) { 276 | DDSS(strongSelf) 277 | NSString *insertsql = [strongSelf insertSQL:tName 278 | dataDic:dataDic]; 279 | BOOL result = [db executeUpdate:insertsql]; 280 | if (resultBlock) { 281 | resultBlock(result); 282 | } 283 | }else { 284 | if (resultBlock) { 285 | resultBlock(NO); 286 | } 287 | } 288 | }else { 289 | if (resultBlock) { 290 | resultBlock(NO); 291 | } 292 | } 293 | }]; 294 | } 295 | 296 | - (void)directInsertTableObjQueue:(NSString *)tName 297 | dataModel:(NSObject *)dataClass { 298 | [self directInsertTableObjQueue:tName 299 | dataDic:dataClass.mj_keyValues]; 300 | } 301 | 302 | - (void)directInsertTableObjQueue:(NSString *)tName 303 | dataModel:(NSObject *)dataClass 304 | result:(void(^)(BOOL result))resultBlock { 305 | [self directInsertTableObjQueue:tName 306 | dataDic:dataClass.mj_keyValues 307 | result:resultBlock]; 308 | } 309 | 310 | - (void)insertTableObjQueue:(NSString *)tName 311 | dataDic:(NSDictionary *)dataDic { 312 | NSArray *keyArr = [dataDic allKeys]; 313 | if (!dbQueue) { 314 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 315 | } 316 | DDWS(weakSelf) 317 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 318 | if ([db tableExists:tName]) { 319 | if (keyArr.count > 0) { 320 | FMResultSet *searchResult; 321 | DDSS(strongSelf) 322 | NSString *searchsql = [strongSelf searchSQL:tName 323 | searchDic:dataDic]; 324 | if ([db tableExists:tName]) { 325 | searchResult = [db executeQuery:searchsql]; 326 | } 327 | if (![searchResult next]) { 328 | NSString *insertsql = [strongSelf insertSQL:tName 329 | dataDic:dataDic]; 330 | if (delegateRespondsTo.tableInsertResult) { 331 | [weakSelf.delegate tableInsertResult:[db executeUpdate:insertsql] 332 | tName:tName 333 | dataDic:dataDic]; 334 | }else { 335 | [db executeUpdate:insertsql]; 336 | } 337 | }else { 338 | if (delegateRespondsTo.tableInsertResult) { 339 | [weakSelf.delegate tableInsertResult:NO 340 | tName:tName 341 | dataDic:dataDic]; 342 | } 343 | } 344 | }else { 345 | if (delegateRespondsTo.tableInsertResult) { 346 | [weakSelf.delegate tableInsertResult:NO 347 | tName:tName 348 | dataDic:dataDic]; 349 | } 350 | } 351 | }else { 352 | if (delegateRespondsTo.tableInsertResult) { 353 | [weakSelf.delegate tableInsertResult:NO 354 | tName:tName 355 | dataDic:dataDic]; 356 | } 357 | } 358 | }]; 359 | } 360 | 361 | - (void)insertTableObjQueue:(NSString *)tName 362 | dataDic:(NSDictionary *)dataDic 363 | result:(void(^)(BOOL result))resultBlock { 364 | NSArray *keyArr = [dataDic allKeys]; 365 | if (!dbQueue) { 366 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 367 | } 368 | DDWS(weakSelf) 369 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 370 | if ([db tableExists:tName]) { 371 | if (keyArr.count > 0) { 372 | FMResultSet *searchResult; 373 | DDSS(strongSelf) 374 | NSString *searchsql = [strongSelf searchSQL:tName 375 | searchDic:dataDic]; 376 | if ([db tableExists:tName]) { 377 | searchResult = [db executeQuery:searchsql]; 378 | } 379 | if (![searchResult next]) { 380 | NSString *insertsql = [strongSelf insertSQL:tName 381 | dataDic:dataDic]; 382 | BOOL result = [db executeUpdate:insertsql]; 383 | if (resultBlock) { 384 | resultBlock(result); 385 | } 386 | }else { 387 | if (resultBlock) { 388 | resultBlock(NO); 389 | } 390 | } 391 | }else { 392 | if (resultBlock) { 393 | resultBlock(NO); 394 | } 395 | } 396 | }else { 397 | if (resultBlock) { 398 | resultBlock(NO); 399 | } 400 | } 401 | }]; 402 | } 403 | 404 | - (void)insertTableObjQueue:(NSString *)tName 405 | dataModel:(NSObject *)dataClass { 406 | [self insertTableObjQueue:tName 407 | dataDic:dataClass.mj_keyValues]; 408 | } 409 | 410 | - (void)insertTableObjQueue:(NSString *)tName 411 | dataModel:(NSObject *)dataClass 412 | result:(void(^)(BOOL result))resultBlock { 413 | [self insertTableObjQueue:tName 414 | dataDic:dataClass.mj_keyValues 415 | result:resultBlock]; 416 | } 417 | #pragma mark - 查询数据------------------------|*|*|*|*|*| 418 | //while ([messWithNumber next]) { 419 | //obj.mycontent = [messWithNumber stringForColumn:@"key"]; 420 | - (FMResultSet *)searchOne:(NSString *)tName 421 | searchDic:(NSDictionary *)searchDic { 422 | FMResultSet *messWithNumber; 423 | NSString *searchsql = [self searchSQL:tName 424 | searchDic:searchDic]; 425 | if ([self.searchHisDB tableExists:tName]) { 426 | messWithNumber = [self.searchHisDB executeQuery:searchsql]; 427 | } 428 | return messWithNumber; 429 | } 430 | 431 | - (FMResultSet *)searchOne:(NSString *)tName 432 | searchModel:(NSObject *)searchClass { 433 | return [self searchOne:tName 434 | searchDic:searchClass.mj_keyValues]; 435 | } 436 | 437 | - (void)searchOneQueue:(NSString *)tName 438 | searchDic:(NSDictionary *)searchDic { 439 | if (!dbQueue) { 440 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 441 | } 442 | DDWS(weakSelf) 443 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 444 | FMResultSet *messWithNumber; 445 | DDSS(strongSelf) 446 | NSString *searchsql = [strongSelf searchSQL:tName 447 | searchDic:searchDic]; 448 | if ([db tableExists:tName]) { 449 | messWithNumber = [db executeQuery:searchsql]; 450 | } 451 | if (delegateRespondsTo.tableSearchResult) { 452 | [weakSelf.delegate tableSearchResult:messWithNumber 453 | tName:tName 454 | dataDic:searchDic]; 455 | } 456 | }]; 457 | } 458 | 459 | - (void)searchOneQueue:(NSString *)tName 460 | searchDic:(NSDictionary *)searchDic 461 | result:(void(^)(id result))resultBlock { 462 | if (!dbQueue) { 463 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 464 | } 465 | DDWS(weakSelf) 466 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 467 | FMResultSet *messWithNumber; 468 | DDSS(strongSelf) 469 | NSString *searchsql = [strongSelf searchSQL:tName 470 | searchDic:searchDic]; 471 | if ([db tableExists:tName]) { 472 | messWithNumber = [db executeQuery:searchsql]; 473 | } 474 | if (resultBlock) { 475 | resultBlock(messWithNumber); 476 | } 477 | }]; 478 | } 479 | 480 | - (void)searchOneQueue:(NSString *)tName 481 | searchModel:(NSObject *)searchClass { 482 | [self searchOneQueue:tName 483 | searchDic:searchClass.mj_keyValues]; 484 | } 485 | 486 | - (void)searchOneQueue:(NSString *)tName 487 | searchModel:(NSObject *)searchClass 488 | result:(void (^)(id))resultBlock{ 489 | [self searchOneQueue:tName 490 | searchDic:searchClass.mj_keyValues 491 | result:resultBlock]; 492 | } 493 | 494 | - (FMResultSet *)searchLastNumber:(NSString *)tableName 495 | number:(long)number { 496 | FMResultSet *messWithNumber; 497 | NSString *searchsql = [NSString stringWithFormat:@"SELECT * FROM %@ order by ddkey DESC limit 0,%ld",tableName,number]; 498 | if ([self.searchHisDB tableExists:tableName]) { 499 | messWithNumber = [self.searchHisDB executeQuery:searchsql]; 500 | } 501 | return messWithNumber; 502 | } 503 | 504 | - (void)searchLastNumberQueue:(NSString *)tName 505 | number:(long)number { 506 | if (!dbQueue) { 507 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 508 | } 509 | DDWS(weakSelf) 510 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 511 | FMResultSet *messWithNumber; 512 | NSString *searchsql = [NSString stringWithFormat:@"SELECT * FROM %@ order by ddkey DESC limit 0,%ld",tName,number]; 513 | if ([db tableExists:tName]) { 514 | messWithNumber = [db executeQuery:searchsql]; 515 | } 516 | if (delegateRespondsTo.tableSearchResult) { 517 | [weakSelf.delegate tableSearchResult:messWithNumber 518 | tName:nil 519 | dataDic:nil]; 520 | } 521 | }]; 522 | } 523 | 524 | - (void)searchLastNumberQueue:(NSString *)tName 525 | number:(long)number 526 | result:(void(^)(id result))resultBlock { 527 | if (!dbQueue) { 528 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 529 | } 530 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 531 | FMResultSet *messWithNumber; 532 | NSString *searchsql = [NSString stringWithFormat:@"SELECT * FROM %@ order by ddkey DESC limit 0,%ld",tName,number]; 533 | if ([db tableExists:tName]) { 534 | messWithNumber = [db executeQuery:searchsql]; 535 | } 536 | if (resultBlock) { 537 | resultBlock(messWithNumber); 538 | } 539 | }]; 540 | } 541 | 542 | - (FMResultSet *)searchAll:(NSString *)tName { 543 | FMResultSet *messWithNumber; 544 | NSString *searchsql = [NSString stringWithFormat:@"SELECT * FROM %@",tName]; 545 | if ([self.searchHisDB tableExists:tName]) { 546 | messWithNumber = [self.searchHisDB executeQuery:searchsql]; 547 | } 548 | return messWithNumber; 549 | } 550 | 551 | - (void)searchAllQueue:(NSString *)tName { 552 | if (!dbQueue) { 553 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 554 | } 555 | DDWS(weakSelf) 556 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 557 | FMResultSet *messWithNumber; 558 | NSString *searchsql = [NSString stringWithFormat:@"SELECT * FROM %@",tName]; 559 | if ([self.searchHisDB tableExists:tName]) { 560 | messWithNumber = [self.searchHisDB executeQuery:searchsql]; 561 | } 562 | if (delegateRespondsTo.tableSearchResult) { 563 | [weakSelf.delegate tableSearchResult:messWithNumber 564 | tName:nil 565 | dataDic:nil]; 566 | } 567 | }]; 568 | } 569 | 570 | - (void)searchAllQueue:(NSString *)tName 571 | result:(void(^)(FMResultSet *result))resultBlock { 572 | if (!dbQueue) { 573 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 574 | } 575 | DDWS(weakSelf) 576 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 577 | FMResultSet *messWithNumber; 578 | NSString *searchsql = [NSString stringWithFormat:@"SELECT * FROM %@",tName]; 579 | if ([weakSelf.searchHisDB tableExists:tName]) { 580 | messWithNumber = [weakSelf.searchHisDB executeQuery:searchsql]; 581 | } 582 | if (resultBlock) { 583 | resultBlock(messWithNumber); 584 | } 585 | }]; 586 | } 587 | 588 | - (NSMutableArray *)searchAllTableName { 589 | NSMutableArray *tableMessName = [NSMutableArray array]; 590 | FMResultSet *tableNameSet; 591 | NSString *searchsql = [NSString stringWithFormat:@"SELECT NAME FROM sqlite_master WHERE type='table' order by name"]; 592 | tableNameSet = [self.searchHisDB executeQuery:searchsql]; 593 | while ([tableNameSet next]) { 594 | if (![[tableNameSet stringForColumn:@"name"] isEqualToString:@"sqlite_sequence"]) { 595 | NSString *tableStringName = [tableNameSet stringForColumn:@"name"]; 596 | [tableMessName addObject:tableStringName]; 597 | } 598 | } 599 | return tableMessName; 600 | } 601 | 602 | - (void)searchAllTableNameQueue { 603 | if (!dbQueue) { 604 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 605 | } 606 | DDWS(weakSelf) 607 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 608 | NSMutableArray *tableMessName = [NSMutableArray array]; 609 | FMResultSet *tableNameSet; 610 | NSString *searchsql = [NSString stringWithFormat:@"SELECT NAME FROM sqlite_master WHERE type='table' order by name"]; 611 | tableNameSet = [db executeQuery:searchsql]; 612 | while ([tableNameSet next]) { 613 | if (![[tableNameSet stringForColumn:@"name"] isEqualToString:@"sqlite_sequence"]) { 614 | NSString *tableStringName = [tableNameSet stringForColumn:@"name"]; 615 | [tableMessName addObject:tableStringName]; 616 | } 617 | } 618 | if (delegateRespondsTo.tableSearchResult) { 619 | [weakSelf.delegate tableSearchResult:tableMessName 620 | tName:nil 621 | dataDic:nil]; 622 | } 623 | }]; 624 | } 625 | 626 | - (void)searchAllTableNameQueue:(void(^)(NSMutableArray *result))resultBlock { 627 | if (!dbQueue) { 628 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 629 | } 630 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 631 | NSMutableArray *tableMessName = [NSMutableArray array]; 632 | FMResultSet *tableNameSet; 633 | NSString *searchsql = [NSString stringWithFormat:@"SELECT NAME FROM sqlite_master WHERE type='table' order by name"]; 634 | tableNameSet = [db executeQuery:searchsql]; 635 | while ([tableNameSet next]) { 636 | if (![[tableNameSet stringForColumn:@"name"] isEqualToString:@"sqlite_sequence"]) { 637 | NSString *tableStringName = [tableNameSet stringForColumn:@"name"]; 638 | [tableMessName addObject:tableStringName]; 639 | } 640 | } 641 | if (resultBlock) { 642 | resultBlock(tableMessName); 643 | } 644 | }]; 645 | } 646 | #pragma mark - 更新表------------------------|*|*|*|*|*| 647 | - (BOOL)updateTableObj:(NSString *)tName 648 | searchDic:(NSDictionary *)searchDic 649 | dataDic:(NSDictionary *)dataDic { 650 | BOOL updateResult = NO; 651 | NSString *updateSql = [self updateSQL:tName 652 | searchDic:searchDic 653 | dataDic:dataDic]; 654 | if ([self.searchHisDB tableExists:tName]) { 655 | updateResult = [self.searchHisDB executeUpdate:updateSql]; 656 | } 657 | return updateResult; 658 | } 659 | 660 | - (BOOL)updateTableObj:(NSString *)tName 661 | searchModel:(NSObject *)searchClass 662 | dataModel:(NSObject *)dataClass { 663 | return [self updateTableObj:tName 664 | searchDic:searchClass.mj_keyValues 665 | dataDic:dataClass.mj_keyValues]; 666 | } 667 | 668 | - (void)updateTableObjQueue:(NSString *)tName 669 | searchDic:(NSDictionary *)searchDic 670 | dataDic:(NSDictionary *)dataDic { 671 | if (!dbQueue) { 672 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 673 | } 674 | DDWS(weakSelf) 675 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 676 | DDSS(strongSelf) 677 | NSString *updateSql = [strongSelf updateSQL:tName 678 | searchDic:searchDic 679 | dataDic:dataDic]; 680 | if ([db tableExists:tName]) { 681 | if (delegateRespondsTo.tableUpdateResult) { 682 | [weakSelf.delegate tableUpdateResult:[db executeUpdate:updateSql] 683 | tName:tName 684 | search:searchDic 685 | dataDic:dataDic]; 686 | }else { 687 | [db executeUpdate:updateSql]; 688 | } 689 | }else { 690 | if (delegateRespondsTo.tableUpdateResult) { 691 | [weakSelf.delegate tableUpdateResult:NO 692 | tName:tName 693 | search:searchDic 694 | dataDic:dataDic]; 695 | } 696 | } 697 | }]; 698 | } 699 | 700 | - (void)updateTableObjQueue:(NSString *)tName 701 | searchDic:(NSDictionary *)searchDic 702 | dataDic:(NSDictionary *)dataDic 703 | result:(void(^)(BOOL result))resultBlock { 704 | if (!dbQueue) { 705 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 706 | } 707 | DDWS(weakSelf) 708 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 709 | DDSS(strongSelf) 710 | NSString *updateSql = [strongSelf updateSQL:tName 711 | searchDic:searchDic 712 | dataDic:dataDic]; 713 | if ([db tableExists:tName]) { 714 | BOOL result = [db executeUpdate:updateSql]; 715 | if (resultBlock) { 716 | resultBlock(result); 717 | } 718 | } else { 719 | if (resultBlock) { 720 | resultBlock(NO); 721 | } 722 | } 723 | }]; 724 | } 725 | 726 | - (void)updateTableObjQueue:(NSString *)tName 727 | searchModel:(NSObject *)searchClass 728 | dataModel:(NSObject *)dataClass { 729 | [self updateTableObjQueue:tName 730 | searchDic:searchClass.mj_keyValues 731 | dataDic:dataClass.mj_keyValues]; 732 | } 733 | 734 | - (void)updateTableObjQueue:(NSString *)tName 735 | searchModel:(NSObject *)searchClass 736 | dataModel:(NSObject *)dataClass 737 | result:(void(^)(BOOL result))resultBlock { 738 | [self updateTableObjQueue:tName 739 | searchDic:searchClass.mj_keyValues 740 | dataDic:dataClass.mj_keyValues 741 | result:resultBlock]; 742 | } 743 | #pragma mark - 删除表------------------------|*|*|*|*|*| 744 | - (BOOL)deleteTable:(NSString *)tName { 745 | NSString *sqlstr = [NSString stringWithFormat:@"DROP TABLE %@", tName]; 746 | if (![self.searchHisDB executeUpdate:sqlstr]) { 747 | return NO; 748 | } 749 | return YES; 750 | } 751 | 752 | - (void)deleteTableQueue:(NSString *)tName { 753 | if (!dbQueue) { 754 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 755 | } 756 | DDWS(weakSelf) 757 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 758 | NSString *sqlstr = [NSString stringWithFormat:@"DROP TABLE %@", tName]; 759 | if (delegateRespondsTo.tableDeleteResult) { 760 | [weakSelf.delegate tableDeleteResult:[db executeUpdate:sqlstr] 761 | tName:tName]; 762 | }else { 763 | [db executeUpdate:sqlstr]; 764 | } 765 | }]; 766 | } 767 | 768 | - (void)deleteTableQueue:(NSString *)tName 769 | result:(void(^)(BOOL result))resultBlock { 770 | if (!dbQueue) { 771 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 772 | } 773 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 774 | NSString *sqlstr = [NSString stringWithFormat:@"DROP TABLE %@", tName]; 775 | BOOL result = [db executeUpdate:sqlstr]; 776 | if (resultBlock) { 777 | resultBlock(result); 778 | } 779 | }]; 780 | } 781 | #pragma mark - 根据sqlKey删除数据------------------------|*|*|*|*|*| 782 | - (BOOL)deleTableOjb:(NSString *)tName 783 | deleteDic:(NSDictionary *)deleteDic { 784 | if ([self.searchHisDB tableExists:tName]) { 785 | NSString *deleteSQL = [self deleteSQL:tName 786 | deleteDic:deleteDic]; 787 | return [self.searchHisDB executeUpdate:deleteSQL]; 788 | } 789 | return NO; 790 | } 791 | 792 | - (void)deleTableOjbQueue:(NSString *)tName 793 | deleteDic:(NSDictionary *)deleteDic { 794 | if (!dbQueue) { 795 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 796 | } 797 | DDWS(weakSelf) 798 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 799 | DDSS(strongSelf) 800 | NSString *deleteSQL = [strongSelf deleteSQL:tName 801 | deleteDic:deleteDic]; 802 | if (delegateRespondsTo.tableDeleteResult) { 803 | [weakSelf.delegate tableDeleteResult:[db executeUpdate:deleteSQL] 804 | tName:tName]; 805 | }else { 806 | [db executeUpdate:deleteSQL]; 807 | } 808 | }]; 809 | } 810 | 811 | - (void)deleTableOjbQueue:(NSString *)tName 812 | deleteDic:(NSDictionary *)deleteDic 813 | result:(void(^)(BOOL result))resultBlock { 814 | if (!dbQueue) { 815 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 816 | } 817 | DDWS(weakSelf) 818 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 819 | DDSS(strongSelf) 820 | NSString *deleteSQL = [strongSelf deleteSQL:tName 821 | deleteDic:deleteDic]; 822 | BOOL result = [db executeUpdate:deleteSQL]; 823 | if (resultBlock) { 824 | resultBlock(result); 825 | } 826 | }]; 827 | } 828 | #pragma mark - 关闭数据库------------------------|*|*|*|*|*| 829 | - (BOOL)closeDB { 830 | return [self.searchHisDB close]; 831 | } 832 | 833 | - (void)closeDBQueue { 834 | if (!dbQueue) { 835 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 836 | } 837 | DDWS(weakSelf) 838 | NSString *dbName = dbCName; 839 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 840 | if (delegateRespondsTo.dbCloseResult) { 841 | [weakSelf.delegate dbCloseResult:[db close] 842 | dbName:dbName]; 843 | }else { 844 | [db close]; 845 | } 846 | }]; 847 | } 848 | 849 | - (void)closeDBQueue:(void(^)(BOOL result))resultBlock { 850 | if (!dbQueue) { 851 | dbQueue = [[FMDatabaseQueue alloc]initWithPath:dbPath]; 852 | } 853 | [dbQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { 854 | BOOL result = [db close]; 855 | if (resultBlock) { 856 | resultBlock(result); 857 | } 858 | }]; 859 | } 860 | #pragma mark - lazy loading统一检查是否响应delegate 861 | - (void)setDelegate:(id)delegate { 862 | if (_delegate != delegate) { 863 | _delegate = delegate; 864 | delegateRespondsTo.tableReadyResult = [delegate respondsToSelector:@selector(tableReadyResult:tName:)]; 865 | delegateRespondsTo.tableDeleteResult = [delegate respondsToSelector:@selector(tableDeleteResult:tName:)]; 866 | delegateRespondsTo.tableInsertResult = [delegate respondsToSelector:@selector(tableInsertResult:tName:dataDic:)]; 867 | delegateRespondsTo.tableSearchResult = [delegate respondsToSelector:@selector(tableSearchResult:tName:dataDic:)]; 868 | delegateRespondsTo.tableUpdateResult = [delegate respondsToSelector:@selector(tableUpdateResult:tName:search:dataDic:)]; 869 | delegateRespondsTo.dbCloseResult = [delegate respondsToSelector:@selector(dbCloseResult:dbName:)]; 870 | } 871 | } 872 | #pragma mark - support methods------------------------|*|*|*|*|*| 873 | /* 获取对象的所有属性名数组 */ 874 | - (NSArray *)getAllPropertiesNameArr:(__unsafe_unretained Class)className { 875 | u_int count; 876 | objc_property_t *properties = class_copyPropertyList(className, &count); 877 | NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count]; 878 | for (int i = 0; i < count ; i++) { 879 | const char *propertyName = property_getName(properties[i]); 880 | [propertiesArray addObject:[NSString stringWithUTF8String:propertyName]]; 881 | } 882 | free(properties); 883 | return propertiesArray; 884 | } 885 | /** 886 | 根据字典生成插入sql 887 | 888 | @param tableName 表名 889 | @param dataDic 参数字典 890 | @return 返回生成的sql 891 | */ 892 | - (NSString *)insertSQL:(NSString *)tableName 893 | dataDic:(NSDictionary *)dataDic { 894 | NSArray *keyArr = [dataDic allKeys]; 895 | __block NSString *keyString = @""; 896 | __block NSString *valueString = @""; 897 | if (keyArr.count == 1) { 898 | keyString = [NSString stringWithFormat:@"(%@)", keyArr[0]]; 899 | valueString = [NSString stringWithFormat:@"('%@')", [dataDic[keyArr[0]] objConvertToStr]]; 900 | }else { 901 | [keyArr enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) { 902 | if (idx == keyArr.count - 1) { 903 | keyString = [NSString stringWithFormat:@"%@ %@)",keyString,obj]; 904 | valueString = [NSString stringWithFormat:@"%@'%@')",valueString,[dataDic[obj] objConvertToStr]]; 905 | }else { 906 | if ([keyString isEqualToString:@""]) { 907 | keyString = [NSString stringWithFormat:@"(%@,",obj]; 908 | valueString = [NSString stringWithFormat:@"('%@',",[dataDic[obj] objConvertToStr]]; 909 | }else { 910 | keyString = [NSString stringWithFormat:@"%@ %@,",keyString,obj]; 911 | valueString = [NSString stringWithFormat:@"%@'%@',",valueString,[dataDic[obj] objConvertToStr]]; 912 | } 913 | } 914 | }]; 915 | } 916 | NSString *insertsql = [NSString stringWithFormat:@"INSERT INTO %@ %@ VALUES %@",tableName,keyString,valueString]; 917 | return insertsql; 918 | } 919 | /** 920 | 根据模型生成插入sql 921 | 922 | @param tableName 表名 923 | @param dataModel 参数模型 924 | @return 返回生成的sql 925 | */ 926 | - (NSString *)insertSQL:(NSString *)tableName 927 | dataModel:(Class)dataModel { 928 | NSDictionary *dataDic = dataModel.mj_keyValues; 929 | return [self insertSQL:tableName 930 | dataDic:dataDic]; 931 | } 932 | 933 | - (NSString *)searchSQL:(NSString *)tName 934 | searchDic:(NSDictionary *)searchDic { 935 | __block NSString *tempString = @""; 936 | [searchDic enumerateKeysAndObjectsUsingBlock:^(NSString *key,id value, BOOL * _Nonnull stop) { 937 | if ([tempString isEqualToString:@""]) { 938 | tempString = [NSString stringWithFormat:@"%@ = '%@'",key,[value objConvertToStr]]; 939 | }else { 940 | tempString = [NSString stringWithFormat:@"%@ AND %@ = '%@'",tempString,key,[value objConvertToStr]]; 941 | } 942 | }]; 943 | NSString *searchSQL; 944 | if ([tempString isEqualToString:@""]) { 945 | searchSQL = [NSString stringWithFormat:@"SELECT * FROM %@",tName]; 946 | }else { 947 | searchSQL = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@",tName,tempString]; 948 | } 949 | return searchSQL; 950 | } 951 | 952 | /** 953 | 根据字典生成更新sql 954 | 955 | @param tName 表名 956 | @param searchDic 更新位置查询参数字典 957 | @param dataDic 更新参数字典 958 | @return 返回生成的更新sql 959 | */ 960 | - (NSString *)updateSQL:(NSString *)tName 961 | searchDic:(NSDictionary *)searchDic 962 | dataDic:(NSDictionary *)dataDic { 963 | __block NSString *tempDataStr = @""; 964 | __block NSString *tempSearchStr = @""; 965 | [dataDic enumerateKeysAndObjectsUsingBlock:^(NSString *key,id value, BOOL * _Nonnull stop) { 966 | if ([tempDataStr isEqualToString:@""]) { 967 | tempDataStr = [NSString stringWithFormat:@"%@ = '%@'",key,[value objConvertToStr]]; 968 | }else { 969 | tempDataStr = [NSString stringWithFormat:@"%@,%@ = '%@'",tempDataStr,key,[value objConvertToStr]]; 970 | } 971 | }]; 972 | [searchDic enumerateKeysAndObjectsUsingBlock:^(NSString *key,id value, BOOL * _Nonnull stop) { 973 | if ([tempSearchStr isEqualToString:@""]) { 974 | tempSearchStr = [NSString stringWithFormat:@"%@ = '%@'",key,[value objConvertToStr]]; 975 | }else { 976 | tempSearchStr = [NSString stringWithFormat:@"%@ AND %@ = '%@'",tempSearchStr,key,[value objConvertToStr]]; 977 | } 978 | }]; 979 | NSString *updatesql; 980 | if ([tempSearchStr isEqualToString:@""]) { 981 | updatesql = [NSString stringWithFormat:@"UPDATE %@ set %@",tName,tempDataStr]; 982 | }else { 983 | updatesql = [NSString stringWithFormat:@"UPDATE %@ set %@ WHERE %@",tName,tempDataStr,tempSearchStr]; 984 | } 985 | return updatesql; 986 | } 987 | 988 | - (NSString *)deleteSQL:(NSString *)tName 989 | deleteDic:(NSDictionary *)deleteDic { 990 | __block NSString *tempDeleteStr = @""; 991 | [deleteDic enumerateKeysAndObjectsUsingBlock:^(NSString *key,id value, BOOL * _Nonnull stop) { 992 | if ([tempDeleteStr isEqualToString:@""]) { 993 | tempDeleteStr = [NSString stringWithFormat:@"%@ = '%@'",key,[value objConvertToStr]]; 994 | }else { 995 | tempDeleteStr = [NSString stringWithFormat:@"%@ AND %@ = '%@'",tempDeleteStr,key,[value objConvertToStr]]; 996 | } 997 | }]; 998 | NSString *deleteSQL; 999 | if ([tempDeleteStr isEqualToString:@""]) { 1000 | deleteSQL = [NSString stringWithFormat:@"DELETE FROM %@",tName]; 1001 | }else { 1002 | deleteSQL = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@",tName,tempDeleteStr]; 1003 | } 1004 | return deleteSQL; 1005 | } 1006 | 1007 | @end 1008 | -------------------------------------------------------------------------------- /SqliteSpec/Classes/DDNSObject+Ext.h: -------------------------------------------------------------------------------- 1 | // 2 | // DDNSObject+Ext.h 3 | // XiYuWang 4 | // 5 | // Created by 李胜书 on 16/5/19. 6 | // Copyright © 2016年 Ehsy_Sanli. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NSObject (Ext) 13 | 14 | + (instancetype)objectInitWithDictionary:(NSDictionary *)data; 15 | 16 | - (void)assginToPropertyWithDictionary: (NSDictionary *) data; 17 | 18 | // obj->string 19 | - (id)objConvertToStr; 20 | // json->obj 21 | - (id)jsonStrConvertToObj; 22 | 23 | /// 包装部分 24 | /// 字典数据转模型数组 25 | + (NSArray *)xxd_objArrFromKeyValues:(id)res; 26 | /// 字典转模型 27 | + (instancetype)xxd_objFromKeyValue:(id)res; 28 | /// 模型转字典 29 | - (NSDictionary *)xxd_keyValues; 30 | /// 模型数组转字典数组 31 | + (NSArray *)xxd_keyValuesArrFromObjArr:(NSArray *)res; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /SqliteSpec/Classes/DDNSObject+Ext.m: -------------------------------------------------------------------------------- 1 | // 2 | // DDNSObject+Ext.m 3 | // XiYuWang 4 | // 5 | // Created by 李胜书 on 16/5/19. 6 | // Copyright © 2016年 Ehsy_Sanli. All rights reserved. 7 | // 8 | 9 | #import "DDNSObject+Ext.h" 10 | 11 | @implementation NSObject (Ext) 12 | 13 | + (instancetype)objectInitWithDictionary:(NSDictionary *)data { 14 | return [[self alloc] initWithDictionary:data]; 15 | } 16 | 17 | - (instancetype)initWithDictionary:(NSDictionary *)data { 18 | { 19 | self = [self init]; 20 | if (self) { 21 | [self assginToPropertyWithDictionary:data]; 22 | } 23 | return self; 24 | } 25 | } 26 | 27 | #pragma mark -- 通过字符串来创建该字符串的Setter方法,并返回 28 | - (SEL) creatSetterWithPropertyName: (NSString *) propertyName{ 29 | //1.首字母大写 30 | if (propertyName.length > 1) { 31 | NSString *tempFirstStr = [propertyName substringToIndex:1]; 32 | NSString *tempSecondStr = [propertyName substringFromIndex:1]; 33 | tempFirstStr = [tempFirstStr capitalizedString]; 34 | propertyName = [tempFirstStr stringByAppendingString:tempSecondStr]; 35 | }else { 36 | propertyName = [propertyName capitalizedString]; 37 | } 38 | //2.拼接上set关键字 39 | propertyName = [NSString stringWithFormat:@"set%@:", propertyName]; 40 | //3.返回set方法 41 | return NSSelectorFromString(propertyName); 42 | } 43 | 44 | /************************************************************************ 45 | *把字典赋值给当前实体类的属性 46 | *参数:字典 47 | *适用情况:当网络请求的数据的key与实体类的属性相同时可以通过此方法吧字典的Value 48 | * 赋值给实体类的属性 49 | ************************************************************************/ 50 | 51 | - (void)assginToPropertyWithDictionary: (NSDictionary *) data { 52 | 53 | if (data == nil) { 54 | return; 55 | } 56 | 57 | //1.获取字典的key 58 | NSArray *dicKey = [data allKeys]; 59 | 60 | //2.循环遍历字典key, 并且动态生成实体类的setter方法,把字典的Value通过setter方法 61 | //赋值给实体类的属性 62 | for (int i = 0; i < dicKey.count; i ++) { 63 | ///2.1 通过getSetterSelWithAttibuteName 方法来获取实体类的set方法 64 | SEL setSel = [self creatSetterWithPropertyName:dicKey[i]]; 65 | 66 | if ([self respondsToSelector:setSel]) { 67 | //2.2 获取字典中key对应的value 68 | NSObject *value = [NSString stringWithFormat:@"%@", data[dicKey[i]]]; 69 | //2.3 把值通过setter方法赋值给实体类的属性 70 | [self performSelectorOnMainThread:setSel 71 | withObject:value 72 | waitUntilDone:[NSThread isMainThread]]; 73 | } 74 | 75 | } 76 | 77 | } 78 | 79 | 80 | /**************************************/ 81 | - (id)objConvertToStr { 82 | if (self == nil) { 83 | return @""; 84 | }else if ([self isKindOfClass:[NSString class]]) { 85 | return (NSString *)self; 86 | }else if ([self isKindOfClass:[NSNumber class]]) { 87 | return [((NSNumber *)self) stringValue]; 88 | } 89 | return [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]; 90 | } 91 | 92 | - (id)jsonStrConvertToObj { 93 | if (![self isKindOfClass:[NSString class]]) { 94 | return [NSNull null]; 95 | } 96 | NSString *json = (NSString *)self; 97 | return [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil]; 98 | } 99 | 100 | + (NSArray *)xxd_objArrFromKeyValues:(id)res { 101 | return [self mj_objectArrayWithKeyValuesArray:res]; 102 | } 103 | + (instancetype)xxd_objFromKeyValue:(id)res { 104 | return [self mj_objectWithKeyValues:res]; 105 | } 106 | 107 | - (NSDictionary *)xxd_keyValues { 108 | return self.mj_keyValues; 109 | } 110 | 111 | + (NSArray *)xxd_keyValuesArrFromObjArr:(NSArray *)res { 112 | return [self mj_keyValuesArrayWithObjectArray:res]; 113 | } 114 | 115 | 116 | @end 117 | --------------------------------------------------------------------------------