• Stars
    star
    616
  • Rank 72,837 (Top 2 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

专业的ORM数据库操作开源库,线程安全,高性能模型对象存储Sqlite开源库,真正实现一行代码操作数据库,让数据库存储变得简单 Professional database storage solutions, thread safe, high-performance model object storage Sqlite open source library, realize one line of code database operation, simple database storage

WHC_ModelSqliteKit

Build Status Pod Version Pod Platform Pod License

架构图


  • Professional database storage solutions, thread safe, high-performance model object storage Sqlite open source library, realize one line of code database operation, simple database storage
  • 专业的数据库存储解决方案,线程安全,高性能模型对象存储Sqlite开源库,真正实现一行代码操作数据库,让数据库存储变得简单

简介

  • 架构: 采用runtime和Sqlite完美结合打造的强大数据库ORM操作引擎开源库
  • 安全: 支持数据库级别加密
  • 易用: 真正实现一行代码操作数据库
  • 目标: 替代直接使用Sqlite和CoreData以及FMDB低效率方式
  • 支持: (NSMutableDictionary,NSMutableArray,NSArray,NSDictionary,NSDate,NSData,NSString,NSNumber,Int,double,float,Bool,char)类型
  • 灵活: 支持使用Sqlite函数进行查询,支持忽略模型类属性存储数据表中
  • 兼容: 支持模型嵌套继承模型类存储到数据库和多表嵌套复杂查询
  • 智能: 根据数据库模型类实现的WHC_SqliteInfo协议返回的版本号来智能更新数据库字段(动态删除/添加)

修复升级: 修复子模型对象为nil访问子模型属性崩溃bug

修复升级: 兼容支持存储NSMutableDictionary, NSMutableArray类型

修复升级: 支持自定义数据库存储路径

升级功能: 支持WHCSqlite操作使用其他方式创建的数据库比如FMDB,只需要指定数据库存储路径。 如果表名不是模型类名称需要指定表名, 详细使用可以参考提供demo,和WHC_SqliteInfo协议

多表嵌套复杂查询

/// 查询person名称为吴海超,并且person的汽车对象的名称为宝马或者person对象学校对象的所在城市对象的名称为北京
NSArray * result = [WHCSqlite query:[Person class] 
        where:@"name = '吴海超' and car.name = '宝马' or school.city.name = '北京'"];

自定义sql查询

persons = [WHCSqlite query:Person.self sql:@"select * from Person"];

/// 来个复杂的例如:
[WHCSqlite query:Model.self sql:@"select cc.* from 
     ( select tt.*,(select count(*)+1 from Chapter where chapter_id =tt.chapter_id and updateTime<tt.updateTime ) as group_id from Chapter tt)
     cc where cc.group_id<=7 order by updateTime desc"];

要求

  • iOS 5.0 or later
  • Xcode 8.0 or later

集成

  • 不需要加密使用: pod 'WHC_ModelSqliteKit'
  • 需要加密数据库使用: pod 'WHC_ModelSqliteKit/SQLCipher'

注意

  • 在需要对数据表自定义信息需要model类实现WHC_SqliteInfo协议
  • 当模型类有新增/删除属性的时候需要在模型类里定义类方法whc_SqliteVersion方法修改模型类(数据库)版本号来表明有字段更新操作,库会根据这个VERSION变更智能检查并自动更新数据库字段,无需手动更新数据库字段
  • 当存储NSArray/NSDictionary属性并且里面是自定义模型对象时,模型对象必须实现NSCoding协议,可以使用WHC_Model库一行代码实现NSCoding相关代码
  • 当需要模型类忽略属性存储数据表时实现whc_IgnorePropertys协议方法即可return要忽略属性名称数组
  • 好用的Mac开源工具:Json生成Class,扫描无用图片,扫描无用类,keyborad
  • 如果要获取主键id值需要在model里声明属性:@property (nonatomic, assign) NSInteger whcId; 或者自定义主键名称的属性
/// 数据库协议信息
@protocol WHC_SqliteInfo <NSObject>
@optional
/**
自定义数据存储路径
@return 自定义数据库路径(目录即可)
*/
+ (NSString *)whc_SqlitePath;

/// 自定义模型类数据库版本号
/** 注意:
***该返回值在改变数据模型属性类型/增加/删除属性时需要更改否则无法自动更新原来模型数据表字段以及类型***
*/
+ (NSString *)whc_SqliteVersion;

/// 自定义数据库加密密码
/** 注意:
***该加密功能需要引用SQLCipher三方库才支持***
/// 引入方式有:
*** 手动引入 ***
*** CocoaPods: pod 'WHC_ModelSqlite/SQLCipher' ***
*/
+ (NSString *)whc_SqlitePasswordKey;

/// 自定义数据表主键名称
/**
*** 返回自定义主键名称默认主键:_id ***
*/
+ (NSString *)whc_SqliteMainkey;

/**
忽略属性集合

@return 返回忽略属性集合
*/
+ (NSArray *)whc_IgnorePropertys;


/**
引入使用其他方式创建的数据库存储路径比如:FMDB
来使用WHC_Sqlite进行操作其他方式创建的数据库

@return 存储路径
*/
+ (NSString *)whc_OtherSqlitePath;


/**
指定自定义表名

在指定引入其他方式创建的数据库时,这个时候如果表名不是模型类名需要实现该方法指定表名称

@return 表名
*/
+ (NSString *)whc_TableName;

@end

用法

1.存储嵌套模型对象到数据库演示

Person * whc = [Person new];
whc.name = @"吴海超";
whc.age = 25;
whc.height = 180.0;
whc.weight = 140.0;
whc.isDeveloper = YES;
whc.sex = 'm';

// 嵌套car对象
whc.car = [Car new];
whc.car.name = @"撼路者";
whc.car.brand = @"大路虎";

// 嵌套school对象
whc.school = [School new];
whc.school.name = @"北京大学";
whc.school.personCount = 5000;

// school对象嵌套city对象
whc.school.city = [City new];
whc.school.city.name = @"北京";
whc.school.city.personCount = 1000;

/// 测试NSArray属性存储
Car * tempCar = [Car new];
tempCar.name = @"宝马";
tempCar.brand = @"林肯";
whc.array = @[@"1",@"2"];
whc.carArray = @[tempCar];

/// 测试NSDictionary属性存储
whc.dict = @{@"1":@"2"};
whc.dictCar = @{@"car": tempCar};

[WHCSqlite insert:whc];

2.存储批量模型对象到数据库演示

NSArray * persons = [self makeArrayPerson];
[WHCSqlite inserts:persons];

3.无条件查询(查询所有记录)数据库中模型类演示

NSArray * personArray = [WHCSqlite query:[Person class]];

3.1.使用Sqlite函数查询数据库演示

/// 获取Person表所有name和name长度
NSArray * nameArray = [WHCSqlite query:[Person class] func:@"name, length(name)"];
NSLog(@"nameArray = %@",nameArray);

/// 获取Person表最大age值
NSNumber * maxAge = [WHCSqlite query:[Person class] func:@"max(age)"];
NSLog(@"maxAge = %@",maxAge);

/// 获取Person表总记录数
NSNumber * sumCount = [WHCSqlite query:[Person class] func:@"count(*)"];
NSLog(@"sumCount = %@",sumCount);

/// 获取Person表字段school.city.name = 北京--0,总记录数
sumCount = [WHCSqlite query:[Person class] func:@"count(*)" condition:@"where school.city.name = '北京--0'"];
NSLog(@"sumCount = %@",sumCount);

4.条件查询数据库中模型类演示(where 条件查询语法和sql where条件查询语法一样)

NSArray * personArray = [WHCSqlite query:[Person class] where:@"name = '吴海超2' OR age <= 18"];

5.查询数据库并对结果排序

///对person数据表查询并且根据age自动降序或者升序排序
[WHCSqlite query:[Person class] order:@"by age desc/asc"];

6.查询数据库并对结果限制查询条数

/// 对person数据表查询并且并且限制查询数量为8
[WHCSqlite query:[Person class] limit:@"8"];

/// 对person数据表查询并且对查询列表偏移8并且限制查询数量为8
[WHCSqlite query:[Person class] limit:@"8 offset 8"];

7.修改数据库中模型对象演示(where 条件查询语法和sql where条件查询语法一样)

/// 更新整条记录
[WHCSqlite update:whc where:@"name = '吴海超2' OR age <= 18"];
/// 更新整条记录中的指定字段(更新Person表在age字段大于25岁时name值为whc,age为100岁)
[WHCSqlite update:Person.self value:@"name = 'whc', age = 100" where:@"age > 25"];

8.删除数据库中模型对象演示(where条件查询为空则删除所有)

[WHCSqlite delete:[Person class] where:@"age = 25 AND name = '吴海超'"];

9.清空指定数据库演示

[WHCSqlite clear:[Person class]];

10.删除数据库演示

[WHCSqlite removeModel:[Person class]];

11.删除所有数据库演示

[WHCSqlite removeAllModel];

12.获取数据库本地路径演示

NSString * path = [WHCSqlite localPathWithModel:[Person class]];

13.获取数据库本地版本号演示

NSString * path = [WHCSqlite versionWithModel:[Person class]];

期待

  • 如果您在使用过程中有任何问题,欢迎issue me! 很乐意为您解答任何相关问题!
  • 与其给我点star,不如向我狠狠地抛来一个BUG!
  • 如果您想要更多的接口来自定义或者建议/意见,欢迎issue me!我会根据大家的需求提供更多的接口!

Api文档

/**
* 说明: 存储模型数组到本地(事务方式)
* @param model_array 模型数组对象(model_array 里对象类型要一致)
*/

+ (BOOL)inserts:(NSArray *)model_array;

/**
* 说明: 存储模型到本地
* @param model_object 模型对象
*/

+ (BOOL)insert:(id)model_object;


/**
* 说明: 获取模型类表总条数
* @param model_class 模型类
* @return 总条数
*/
+ (NSUInteger)count:(Class)model_class;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @return 查询模型对象数组
*/

+ (NSArray *)query:(Class)model_class;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param where 查询条件(查询语法和SQL where 查询语法一样,where为空则查询所有)
* @return 查询模型对象数组
*/

+ (NSArray *)query:(Class)model_class where:(NSString *)where;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param order 排序条件(排序语法和SQL order 查询语法一样,order为空则不排序)
* @return 查询模型对象数组
*/

/// �example: [WHCSqlite query:[Person class] order:@"by age desc/asc"];
/// 对person数据表查询并且根据age自动降序或者升序排序

+ (NSArray *)query:(Class)model_class order:(NSString *)order;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param limit 限制条件(限制语法和SQL limit 查询语法一样,limit为空则不限制查询)
* @return 查询模型对象数组
*/

/// �example: [WHCSqlite query:[Person class] limit:@"8"];
/// 对person数据表查询并且并且限制查询数量为8
/// �example: [WHCSqlite query:[Person class] limit:@"8 offset 8"];
/// 对person数据表查询并且对查询列表偏移8并且限制查询数量为8

+ (NSArray *)query:(Class)model_class limit:(NSString *)limit;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param where 查询条件(查询语法和SQL where 查询语法一样,where为空则查询所有)
* @param order 排序条件(排序语法和SQL order 查询语法一样,order为空则不排序)
* @return 查询模型对象数组
*/

/// �example: [WHCSqlite query:[Person class] where:@"age < 30" order:@"by age desc/asc"];
/// 对person数据表查询age小于30岁并且根据age自动降序或者升序排序

+ (NSArray *)query:(Class)model_class where:(NSString *)where order:(NSString *)order;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param where 查询条件(查询语法和SQL where 查询语法一样,where为空则查询所有)
* @param limit 限制条件(限制语法和SQL limit 查询语法一样,limit为空则不限制查询)
* @return 查询模型对象数组
*/

/// �example: [WHCSqlite query:[Person class] where:@"age <= 30" limit:@"8"];
/// 对person数据表查询age小于30岁并且限制查询数量为8
/// �example: [WHCSqlite query:[Person class] where:@"age <= 30" limit:@"8 offset 8"];
/// 对person数据表查询age小于30岁并且对查询列表偏移8并且限制查询数量为8

+ (NSArray *)query:(Class)model_class where:(NSString *)where limit:(NSString *)limit;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param order 排序条件(排序语法和SQL order 查询语法一样,order为空则不排序)
* @param limit 限制条件(限制语法和SQL limit 查询语法一样,limit为空则不限制查询)
* @return 查询模型对象数组
*/

/// �example: [WHCSqlite query:[Person class] order:@"by age desc/asc" limit:@"8"];
/// 对person数据表查询并且根据age自动降序或者升序排序并且限制查询的数量为8
/// �example: [WHCSqlite query:[Person class] order:@"by age desc/asc" limit:@"8 offset 8"];
/// 对person数据表查询并且根据age自动降序或者升序排序并且限制查询的数量为8偏移为8

+ (NSArray *)query:(Class)model_class order:(NSString *)order limit:(NSString *)limit;

/**
* 说明: 查询本地模型对象
* @param model_class 模型类
* @param where 查询条件(查询语法和SQL where 查询语法一样,where为空则查询所有)
* @param order 排序条件(排序语法和SQL order 查询语法一样,order为空则不排序)
* @param limit 限制条件(限制语法和SQL limit 查询语法一样,limit为空则不限制查询)
* @return 查询模型对象数组
*/

/// �example: [WHCSqlite query:[Person class] where:@"age <= 30" order:@"by age desc/asc" limit:@"8"];
/// 对person数据表查询age小于30岁并且根据age自动降序或者升序排序并且限制查询的数量为8
/// �example: [WHCSqlite query:[Person class] where:@"age <= 30" order:@"by age desc/asc" limit:@"8 offset 8"];
/// 对person数据表查询age小于30岁并且根据age自动降序或者升序排序并且限制查询的数量为8偏移为8

+ (NSArray *)query:(Class)model_class where:(NSString *)where order:(NSString *)order limit:(NSString *)limit;


/**
说明: 自定义sql查询

@param model_class 接收model类
@param sql sql语句
@return 查询模型对象数组

/// �example: [WHCSqlite query:Model.self sql:@"select cc.* from ( select tt.*,(select count(*)+1 from Chapter where chapter_id =tt.chapter_id and updateTime<tt.updateTime ) as group_id from Chapter tt) cc where cc.group_id<=7 order by updateTime desc"];
*/
+ (NSArray *)query:(Class)model_class sql:(NSString *)sql;

/**
* 说明: 利用sqlite 函数进行查询

* @param model_class 要查询模型类
* @param sqliteFunc sqlite函数例如:(MAX(age),MIN(age),COUNT(*)....)
* @return 返回查询结果(如果结果条数 > 1返回Array , = 1返回单个值 , = 0返回nil)
* /// �example: [WHCSqlite query:[Person class] sqliteFunc:@"max(age)"];  /// 获取Person表的最大age值
* /// �example: [WHCSqlite query:[Person class] sqliteFunc:@"count(*)"];  /// 获取Person表的总记录条数
*/
+ (id)query:(Class)model_class func:(NSString *)func;

/**
* 说明: 利用sqlite 函数进行查询

* @param model_class 要查询模型类
* @param sqliteFunc sqlite函数例如:(MAX(age),MIN(age),COUNT(*)....)
* @param condition 其他查询条件例如:(where age > 20 order by age desc ....)
* @return 返回查询结果(如果结果条数 > 1返回Array , = 1返回单个值 , = 0返回nil)
* /// �example: [WHCSqlite query:[Person class] sqliteFunc:@"max(age)" condition:@"where name = '北京'"];  /// 获取Person表name=北京集合中的的最大age值
* /// �example: [WHCSqlite query:[Person class] sqliteFunc:@"count(*)" condition:@"where name = '北京'"];  /// 获取Person表name=北京集合中的总记录条数
*/
+ (id)query:(Class)model_class func:(NSString *)func condition:(NSString *)condition;

/**
* 说明: 更新本地模型对象
* @param model_object 模型对象
* @param where 查询条件(查询语法和SQL where 查询语法一样,where为空则更新所有)
*/

+ (BOOL)update:(id)model_object where:(NSString *)where;


/**
说明: 更新数据表字段

@param model_class 模型类
@param value 更新的值
@param where 更新条件
@return 是否成功
/// 更新Person表在age字段大于25岁是的name值为whc,age为100岁
/// �example: [WHCSqlite update:Person.self value:@"name = 'whc', age = 100" where:@"age > 25"];
*/
+ (BOOL)update:(Class)model_class value:(NSString *)value where:(NSString *)where;

/**
* 说明: 清空本地模型对象
* @param model_class 模型类
*/

+ (BOOL)clear:(Class)model_class;


/**
* 说明: 删除本地模型对象
* @param model_class 模型类
* @param where 查询条件(查询语法和SQL where 查询语法一样,where为空则删除所有)
*/

+ (BOOL)delete:(Class)model_class where:(NSString *)where;

/**
* 说明: 清空所有本地模型数据库
*/

+ (void)removeAllModel;

/**
* 说明: 清空指定本地模型数据库
* @param model_class 模型类
*/

+ (void)removeModel:(Class)model_class;

/**
* 说明: 返回本地模型数据库路径
* @param model_class 模型类
* @return 路径
*/

+ (NSString *)localPathWithModel:(Class)model_class;

/**
* 说明: 返回本地模型数据库版本号
* @param model_class 模型类
* @return 版本号
*/
+ (NSString *)versionWithModel:(Class)model_class;

Licenses

All source code is licensed under the MIT License.

More Repositories

1

WHC_DataModelFactory

Mac上iOS开发辅助工具,快速把json/xml数据转换生成对应模型类属性,省去麻烦手动创建,提高开发效率。Mac iOS development aid, quickly put the json/XML data transformation generates the corresponding model class attribute, save trouble created manually, improve the development efficiency.
Objective-C
1,183
star
2

WHC_AutoLayoutKit

iOS and Mac OS X platforms currently in use the fastest the simplest development to build the UI layout automatically open source library, strong dynamic layout constraint handling capacity,iOS/Mac OS X平台上使用简单动态布局约束处理能力
Objective-C
864
star
3

WHCNetWorkKit

WHCNetWorkKit 是http网络请求开源库(支持GET/POST 文件上传 后台文件下载 UIButton UIImageView 控件设置网络图片 网络数据工具json/xml 转模型类对象 网络状态监听)
Objective-C
470
star
4

WHC_Scan

高效强大扫描分析iOS和Android项目里没有使用的类Mac开源工具,清理项目垃圾类,让项目结构干净清爽,升级维护得心应手. Efficient and powerful scanning analysis iOS and Android project no classes used in Mac open source tools, cleaning rubbish class project, make project structure clean and relaxed, upgrade maintenance
Swift
429
star
5

WHC_KeyboardManager

IOS lightweight keyboard manager, use simple and powerful, the keyboard will never block input controls. iOS轻量级的键盘管理器,使用简单功能强大,键盘再也不会挡住输入控件
Objective-C
307
star
6

WHC_ScanUnreferenceImageTool

扫描项目里没有使用的图片工具,删除没有引用的图片以减小打包体积 Scanning project does not use images in tool, delete without reference images to reduce the packaging volume
Swift
284
star
7

WHC_CollectionViewFramework

高仿支付宝可拖拽排序编辑动画效果集合视图
Swift
264
star
8

WHC_Model

iOS平台高效转换引擎json->model,model->json,model->Dictionary,支持模型类继承其他模型类,支持指定路径转换,不区分json的key和模型属性名称大小写,自动处理json中null
Objective-C
246
star
9

react-native-whcapp

react-native + redux whcapp Provide learning advice for learning react-native development Support: Android 5+ iOS 8.0+,一个完整的react-native app 并且带有完整的数据交互实现
JavaScript
216
star
10

WHC_-ContainerView

高仿qq未读消息拖拽和网易新闻viewpager特效集成
Objective-C
131
star
11

whc_wechat_image_edit

开源一个完整微信小程序app,已经上线了名称《节日头像生成》 主要功能:给微信头像进行编辑添加节日标签, 节日海报的制作生成
JavaScript
120
star
12

WHC_ReaderKit

轻量级小说阅读架构(简单,高效)
Swift
85
star
13

SexyJson

SexyJson is Swift5.+ json parse open source library quickly and easily, perfect supporting class and struct model, fully oriented protocol architecture, support iOS and MAC OS X
Swift
67
star
14

WHC_PageViewKit

iOS平台轻量级的PageView组件,其中TitleBar拥有30多种UI样式
Swift
60
star
15

react-native-whc-banner

A react native module to banner auto play loop component, it works on iOS and Android
JavaScript
59
star
16

WHC_Layout

Swift iOS and Mac OS X platforms currently in use the fastest the simplest development to build the UI layout automatically open source library, strong dynamic layout constraint handling capacity,iOS/Mac OS X平台上目前使用最简单开发构建UI速度最快的自动布局开源库,强悍的动态布局约束处理能力
Swift
59
star
17

WHC_GestureUnlockScreenDemo

屏幕解锁(android类型手势拖拽解锁和iphone数字键盘解锁两种类型)采用动态渐变的色彩绘制整个UI,对于想学习动态和渐变绘图的开发者很有帮助。
Objective-C
51
star
18

whc_flutter_app

flutter whcapp Provide learning advice for learning flutter development Support: Android 5+ iOS 8.0+,一个完整的flutter app 并且带有完整的数据交互实现
Dart
51
star
19

WHC_Debuger

IOS Debuger super convenient development auxiliary debugger, in a team or maintenance projects according to the UI quickly locate unknown to the Class files, and from the quick fix related bugs .iOS Debuger超方便开发辅助调试器,在团队开发或者维护未知项目根据UI快速定位到Class文件,而从快速解决相关bug
Objective-C
37
star
20

WHC_PullAndUpRefreshDemo

高仿QQ下拉水滴刷新效果
Objective-C
36
star
21

react-native-whc-loading

A react native module to show loading ui, it works on iOS and Android.
JavaScript
32
star
22

react-native-whc-calendar

A react native module to show calendar, it works on iOS and Android. 跨平台日历组件支持iOS、Android
JavaScript
28
star
23

WHC_QRCodeScan

封装系统和ZXingObjc 二维码扫描,相册图片二维码识别,二维码生成,swift版和oc版
Objective-C
27
star
24

whc-json-to-class

javascript版本json自动转换生成对应语言模型类The whc-json-to-class is the javascript plug-in that automatically converts the json string to the corresponding language model class
JavaScript
25
star
25

FunWave

FunWave is Swift4.+ simple fun wave open source component
Swift
24
star
26

react-native-whc-toast

A react native module to show toast alert, it works on iOS and Android.
JavaScript
20
star
27

WHC_PhotoCameraChoicePictureDemo

iOS从相册和相机选择图片进行封装
Objective-C
19
star
28

Flutter-NotificationCenter

A lightweight, easy-to-use notification component library that corresponds to Dart supports post notification listening for notifications and notification removal
Dart
19
star
29

WHC_NavigationControllerKit

Lightweight gesture to return framework (simple, efficient)轻量级手势返回框架(简单,高效)
Objective-C
18
star
30

react-whc-notification

A react、vue、react native module to post and observer notification, it works on React 、React-Native Vue、H5. (支持一对多发送通知消息、主要解决react、react-native、vue、h5夸组件页面之间的通信状态管理等),该组件可以用来替代Redux,Vuex进行状态管理
JavaScript
18
star
31

WHC_BannerKit

Lightweight image shuffling components (efficient, simple)轻量级的本地以及网络自动轮播器(简单,高效)
Objective-C
14
star
32

WHC_TetrisGame

oc版俄罗斯方块游戏
Objective-C
13
star
33

WHC_XMLParser

自动解析xml为字典对象
Objective-C
12
star
34

react-native-whc-grid

A react native module to show grid view, it works on iOS and Android
JavaScript
12
star
35

store

这是带有过期时间的h5数据存储组件支持sessionStorage,localStorage
JavaScript
9
star
36

WHC_DragBadgeViewDemo

仿QQ未读消息badge拖拽水滴效果
Objective-C
5
star
37

WHC_XML

自动把字典转换为xml数据
Objective-C
4
star
38

qqFrame

高仿QQ侧滑菜单框架
Objective-C
4
star
39

qqSpaceFrame

高仿QQ空间侧滑菜单高斯模糊效果
Objective-C
3
star
40

WHC_Json

自动把字典转换为json
Objective-C
3
star