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

267 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情

预备知识

在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 保存支付方式开关

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

  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都会重新登录,)

blog.csdn.net/z929118967/…