之前提到到前端处理数据线程的解决方案,这里有需要到数据的本地存储,数据持久最好的方式首选数据库。那现在在我们的面前的有两种选择,一种是apple的coredata,另外一种就是采用FMDB。我的主观反应是,我首推的是FMDB,FMDB的灵活性能更强,适用于多种场景,在数据处理上,可以通过选择不同的SQL语句,达到更好的效果。在FMDB的基础上,还有一个更便利的框架--GYDataCenter。
这里就从一个比较完整的数据模型的创建来讲解着一个解决方案。
这个解决方案大体上分为:数据模型(数据表),数据操作(逻辑运算)和数据迁移,其实就是数据的增删查改,对于不是很了解的SQL语句的开发者来说,这个在方便不过了,在下面的内容里面也穿插讲解一下MD5和基础用户存储的一些解决方案。
主要内容:
1.用户的概念
2.如何创建一个数据库和库表
3.如何进行增删查改
本文主要讲解1 、 2两个点。
1.用户的概念
首先,我们必须明白有用户群体就拥有商机,我在给一些项目做维护的时候,很多开发者喜欢用
NSUserDefaults
去存储一些用户或者登录者的基本信息,甚至去存储支付类的私钥或者公钥。个人不是很提倡使用这个种方法,一方面考虑到安全性的问题,一方面代码要写得高大上一丢丢。
Apple提供了一个加密类给开发者提供--
NSKeyedArchiver
,
其实就是一个归档的过程,保存用户信息就是创建一个档案,很多开发者觉得这个类用起来比较麻烦,所以很多人都不忽略它的存在。
我们来看看这个类到底怎么用,我们创建一个user基础信息的模型,从网络请求回来的数据转换成模型就比较容易操作了,这个是时候,一般用户的基本信息都是不作修改的,所以在创建的时候我们可以将用户的属性设置成
readonly(只是建议需要根据实际的情况去决定)
。
创建一个QYJUserInfo的model,在.h文件里面去定义需要的字段。
#import <Foundation/Foundation.h>
@interface QYJUserInfo : NSObject <NSCopying>
{
NSString *_id;
}
/**
* 账号
*/
@property (nonatomic, copy) NSString *username;
/**
* 密码
*/
@property (nonatomic, copy) NSString *password;
/**
* 邮箱
*/
@property (nonatomic, copy) NSString *email;
/**
* 删除标识,未删:0,已删:1
*/
@property (nonatomic, copy) NSString *deleted;
/**
* 用户ID
*/
@property (nonatomic, copy) NSString *userID;
/**
* 中文名
*/
@property (nonatomic, copy) NSString *cname;
/**
* 联系手机号码
*/
@property (nonatomic, copy) NSString *phone;
/**
* 用户类型
*/
@property (nonatomic, copy) NSString *type;
/**
* 英文名
*/
@property (nonatomic, copy) NSString *ename;
/**
* 创建时间
*/
@property (nonatomic, copy) NSString *created_dt;
/**
* 更新时间
*/
@property (nonatomic, copy) NSString *updated_dt;
/**
* 基础方法
*/
/*
@method toModelWithDictionary:
@abstrac 字典转模型,用户类型一般只处理一个
@discussion 字典转模型
@param dict (NSDictionary *)
@result QYJUserInfo 对象
*/
+ (instancetype)toModelWithDictionary:(NSDictionary *)dict;
/*
@method toDictionary
@abstrac 转字典
@discussion 转字典
@param No param
@result NSDictionary
*/
- (NSDictionary *)toDictionary;
/*
@method getMD5
@abstrac 将对象的值和属性名转成字符串MD5
@discussion 将对象的值和属性名转成字符串MD5
@param No param
@result NSString
*/
- (NSString *)getMD5;
/*
@method saveObjectToLocal
@abstrac 保存对象到本地
@discussion 保存对象到本地
@param No param
@result BOOL 保存结果
*/
- (BOOL)saveObjectToLocal;
/*
@method localUserInfo:
@abstrac 查询本地用户信息,一般做自动登录的用户只允许有一个
@discussion 查询本地用户信息
@param No param
@result QYJUserInfo对象
*/
+ (instancetype)localUserInfo;
/*
@method deleteUserInfo:
@abstrac 删除本地存储的用户数据,在用户点击出按钮的时候调用
@discussion 删除本地存储的用户数据,在用户点击出按钮的时候调用
@param No param
@result No return
*/
+ (void)deleteUserInfo;
/*
@method compare:
@abstrac 比较大小
@discussion 比较大小
@param QYJUserInfo对象
@result NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
*/
- (NSComparisonResult)compare:(QYJUserInfo *)otherObject;
@end
在.m的文件中我们要去实现我们声明的文件。
#import "QYJUserInfo.h"
//runtime 需要引用的头文件
#import <objc/runtime.h>
#import "NSString+MD5.h"
// 保存的Key
static NSString *const localSaveKey = @"com.userInfo.qyj";
@implementation QYJUserInfo
@synthesize userID = _id;
#pragma mark - NSCopying
- (id)copyWithZone:(NSZone *)zone {
Class modelClass = [self class];
QYJUserInfo *object = [[modelClass alloc] init];
NSArray *propertyName = [modelClass getPropertyNames];
NSLog(@"%@", propertyName);
for (NSString *property in propertyName) {
[object setValue:[self valueForKey:property] forKey:property];
}
return object;
}
+ (NSArray *)getPropertyNames {
NSMutableArray *names = @[].mutableCopy;
u_int count;
objc_property_t *properties = class_copyPropertyList(self, &