0
点赞
收藏
分享

微信扫一扫

iOS小技能: 使用数据库表存储信息


预备知识

在iOS应用程序中,从“数据缓存在哪里”这个维度看,缓存一般分为两种类型。 ·内存缓存 ·磁盘缓存

内存缓存

是将数据缓存在内存中,供应用程序直接读取和使用。

  • 优点是读写速度极快。
  • 缺点是由于内存资源有限,应用程序在系统中申请的内存,会随着应用程序生命周期的结束而被释放。这就意味着,如果应用程序在运行的过程中被用户强杀或者出现崩溃情况,都有可能导致内存中缓存的数据丢失,因此,将事件数据缓存在内存中不是最佳选择。
  • 磁盘缓存
  • 是将数据缓存在磁盘空间中,其特点正好与内存缓存相反。磁盘缓存容量大,但是读写速度相对于内存缓存来说要慢一些。不过磁盘缓存是持久化存储,不受应用程序生命周期的影响。一般情况下,一旦数据成功地保存在磁盘中,丢失的风险就非常低。因此,即使磁盘缓存数据读写速度较慢,但综合考虑下,磁盘缓存是缓存事件数据的最优选择。

本文重点

使用到的第三方框架《BGFMDB》进行数据存储

pod 'BGFMDB', '~> 2.0.13'  #2.0.9

#import <BGFMDB/BGFMDB.h>

I 案例1:存储用户ID

例子: 存储显示过广告弹窗的用户ID, 应用场景:首次打开app进行广告弹窗)

1.1 表名的声明

/**

存储是否显示广告弹窗i信息表明:
应用场景:首次打开app进行广告弹窗

*/
NSString * const k_ShowADs_TableName=@"k_ShowADs_TableName";

extern NSString * _Nonnull const k_ShowADs_TableName;

1.2 数据模型的定义

@property (strong, nonatomic) QCTCurrentSysUser *CurrentSysUser;

  • QCTCurrentSysUser

/**
用户id

*/


@property (nonatomic,copy) NSString *userInfoId;

1.3 存储和获取

+ (instancetype)getmodelWith_UserInfoId:(NSString*)userInfoId{

// 查询条件
NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"userInfoId"),bg_sqlValue(userInfoId)];


NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:k_ShowADs_TableName where:where] ];



if(tmparr.count>0 ){

QCTCurrentSysUser *userModel = tmparr.firstObject;




NSLog(@"获取的用户 信息%@",userModel.mj_keyValues);



return tmparr.firstObject;

}



return nil;



}



+ (void)saveModelToDBWithModel:(QCTCurrentSysUser*)userModel{


// [self emptySeeionLocal];
// 表名
userModel.bg_tableName = k_ShowADs_TableName;



// 设置一些参数
// userModel.currentHost = currentHost;
//

BOOL isSave = [userModel bg_save];// 保存方法



if (isSave) {

NSLog(@"SysUser保存成功:%@",userModel.mj_keyValues);
//2020-08-04 17:09:06.863509+0800 Housekeeper[1526:203239] DB Error: 1 "no such table: k_ShowADs_TableName"



}else{
NSLog(@"SysUser保存失败:%@",userModel.mj_keyValues);


}


}

1.4 使用数据

- (void)setupisShowCRMShowAdV{

// 获取当前的登陆账号,判断是否弹出过。

if([NSStringQCTtoll isBlankString:UserInfoModel.shareUserInfoModel.CurrentSysUser.userInfoId]){
self.noteViw.hidden = NO;

return ;


}


if(![QCTCurrentSysUser getmodelWith_UserInfoId:UserInfoModel.shareUserInfoModel.CurrentSysUser.userInfoId]){// 为空,表示没显示过

[self.AdV show];

self.noteViw.hidden = YES;

[QCTCurrentSysUser saveModelToDBWithModel:UserInfoModel.shareUserInfoModel.CurrentSysUser];
}else{


self.noteViw.hidden = NO;



}




}

II 案例2: token的存储、获取及清空

2.1 存储用户的会话信息

#pragma mark - ******** iOS 优化登录流程:【打开app,如果 token不过期,就使用最近一次登录的tokenn进行接口请求。】(现状是每次打开app都会重新登录)

+ (void)saveModelWithModel:(UserInfoModel*)userModel{
[self emptySeeionLocal];


userModel.bg_tableName = QCTUserInfoModelTableName;


NSString* currentHost = [NSString stringWithFormat:@"%@%@",[[NSUserDefaults standardUserDefaults]objectForKey:@"KAPPServiceIP"],@""];
userModel.currentHost = currentHost;
NSLog(@" saveModelWithModel currentHost:%@",currentHost);


BOOL isSave = [userModel bg_save];// 保存方法
if (isSave) {
NSLog(@"token保存成功:%@",userModel.mj_keyValues);


}else{
NSLog(@"token保存失败:%@",userModel.mj_keyValues);


}


}

2.2 获取和清除会话信息

+ (instancetype)getmodel4LoginSeesion{


NSString* currentHost = [NSString stringWithFormat:@"%@%@",[[NSUserDefaults standardUserDefaults]objectForKey:@"KAPPServiceIP"],@""];

NSLog(@" getmodel4LoginSeesion currentHost:%@",currentHost);


NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"currentHost"),bg_sqlValue(currentHost)];


NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:where] ];



if(tmparr.count>0 ){
UserInfoModel *userModel = tmparr.firstObject;
// QCTSession.shareQCTSession.userInfo = userModel;

[ QCTSession SaveUserInfo:userModel];

NSLog(@"获取的token 信息%@",userModel.mj_keyValues);


return tmparr.firstObject;

}

NSLog(@"获取的token userModel.shareUserInfoModel %@",UserInfoModel.shareUserInfoModel);


//

return UserInfoModel.shareUserInfoModel;


}

+(void)emptySeeionLocal{


NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:nil] ];


// 先删除

for (UserInfoModel *loginModel in tmparr) {
NSString *where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"bg_id"),bg_sqlValue(loginModel.bg_id)];


BOOL isDelete = [UserInfoModel bg_delete:[NSString stringWithFormat:@"%@",QCTUserInfoModelTableName] where:where];
NSLog(@"删除UserInfoModel重复数据%@:%@",isDelete?@"成功":@"失败",loginModel.mj_keyValues);
//
}

}

III 案例3 保存支付方式开关

根据门店保存当前的支付方式开发: 现金和会员支付

iOS小技能: 使用数据库表存储信息_磁盘缓存

  1. 查询支付方式开关

+ (instancetype)getmodelWithPayWayGroupBaseId:(NSString*)payWayGroupBaseId{


QCTPayWayConfigNoProduct *tmp = [QCTPayWayConfigNoProduct new];


tmp.payWayGroupBaseId = payWayGroupBaseId;
tmp.storeId = [UserInfoModel.shareUserInfoModel store].id;

//NSString * const k_ERPpayWayGroupTableName =@"k_ERPpayWayGroupTableName";

// tmp.tab
tmp.bg_tableName = k_ERPpayWayGroupTableName;


tmp.isOpen = NO;



if([NSStringQCTtoll isBlankString:tmp.payWayGroupBaseId]){

NSLog(@"获取的打印开关信息%@",tmp.payWayGroupBaseId);
return tmp;
}


NSString* where = [NSString stringWithFormat:@"where %@=%@ and %@=%@",bg_sqlKey(@"payWayGroupBaseId"),bg_sqlValue(payWayGroupBaseId),bg_sqlKey(@"storeId"),bg_sqlValue(tmp.storeId)];

NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:k_ERPpayWayGroupTableName where:where] ];



if(tmparr.count>0 ){
NSLog(@"firstObject 获取的开关信息%@",[tmparr.firstObject mj_keyValues]);

return tmparr.firstObject;

}
NSLog(@"获取的开关信息%@",tmp.mj_keyValues);

return tmp;

}

  1. 保存支付方式开关

+ (void)saveModel:(QCTPayWayConfigNoProduct*)model{
model.storeId = [UserInfoModel.shareUserInfoModel store].id;

NSString* where = [NSString stringWithFormat:@"where %@=%@ and %@=%@",bg_sqlKey(@"payWayGroupBaseId"),bg_sqlValue(model.payWayGroupBaseId),bg_sqlKey(@"storeId"),bg_sqlValue(model.storeId)];

NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[ [self class] bg_find:k_ERPpayWayGroupTableName where:where] ];


// 先删除

for (QCTPayWayConfigNoProduct *loginModel in tmparr) {
// if ([loginModel.LoginName isEqualToString:self.viewModel.paramsModel.LoginName]) {
NSString *where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"bg_id"),bg_sqlValue(loginModel.bg_id)];


BOOL isDelete = [QCTPayWayConfigNoProduct bg_delete:[NSString stringWithFormat:@"%@",k_ERPpayWayGroupTableName] where:where];
NSLog(@"删除重复数据%@:%@",isDelete?@"成功":@"失败",loginModel.mj_keyValues);
// break;
// }
}

// model.mobile = UserInfoModel.shareUserInfoModel.mobile;
model.bg_tableName = k_ERPpayWayGroupTableName;


NSLog(@"k_ERPpayWayGroupTableName bg_save : %@",model.mj_keyValues);

BOOL isSave = [model bg_save];// 保存方法
if (isSave) {
NSLog(@"开关保存成功:%@",model.mj_keyValues);


}else{
NSLog(@"开关保存失败");

}


}

see also

​​iOS 优化登录流程:【打开app,如果 token不过期,就使用最近一次登录的tokenn进行接口请求。】优化token的存储方式:(之前只是存储在内存,每次打开app都会重新登录,) ​​


举报

相关推荐

0 条评论