美文网首页搬砖
iOS 购物车本地缓存基于FMDB的实现&Demo

iOS 购物车本地缓存基于FMDB的实现&Demo

作者: iOS_July | 来源:发表于2018-07-27 00:42 被阅读579次

需求:做一个本地购物车的缓存,来实现下一次打开app,购物车里依旧有商品,增强用户体验
实现:利用FMDB、进行简单的数据库语句封装,模拟实现购物车的缓存

一、先看效果
  • 首先,我们打开购物车,为空,此时去添加商品到购物车:


    ShopCart1.gif
  • 退出app、关闭进程后,再次进入,读取数据库数据:


    ShopCart2.gif
  • 录制的GIF图、数据不一致,是因为这是多次操作了,并不是数据存储错误哈,意思呢,就是这么个意思。
二、思路讲解
  • 增、删操作,对应UI上的商品加减
  • 进入购物车页面,先进行数据库查询
  • 在加入商品至购物车的页面,先获取到商品信息,对应的,进行加减操作,数据库,分第一次加入购物车加入购物车
  • 通过查询,分出是第一次加入还是非第一次加入,如为第一次加入,则需创建表
三、数据库方法
/**
 查找数据库

 @param pathString 路径字符串@"xx.sqlite"
 */
+ (void)querySQLWithPath:(NSString *)pathString;


/**
 创建表

 @param sqlName 表名
 @param block 回调
 */
+ (void)createTableWithSQLName:(NSString *)sqlName andResultBlock:(void(^)(NSString *result))block;



/**
 增

 @param sqlName 表名
 @param block 回调
 */
+(void)insertSQLWithName:(NSString *)sqlName andResultBlocck:(void(^)(BOOL result))block;


/**
 删

 @param sqlName 表名
 @param block 回调
 */
+(void)deleteSQLWithName:(NSString *)sqlName andResultBlock:(void(^)(BOOL result))block;


/**
 更新

 @param sqlName 表名
 @param block 回调
 */
+(void)updateSQLWithName:(NSString *)sqlName andResultBlocck:(void (^)(BOOL result))block;


/**
 搜索一条数据

 @param sqlName 表名
 @param block 回调
 */
+(void)searchOneDataWithSQL:(NSString *)sqlName andResultBlock:(void (^)(BOOL result, NSDictionary *dict))block;


/**
 搜索所有数据

 @param sqlName 表名
 @param block 回调
 */
+(void)searchAllDataWithSQL:(NSString *)sqlName andResultBlock:(void (^)(BOOL success, NSMutableArray *goodList))block;
四、数据库方法实现
/**
 查找数据库
 
 @param pathString 路径字符串@"xx.sqlite"
 */
+ (void)querySQLWithPath:(NSString *)pathString
{
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:pathString];
    
    //FMDB 创建数据库文件
    db = [FMDatabase databaseWithPath:path];
    NSLog(@"db--path==%@",path);
}


/**
 创建表
 
 @param sqlName 表名
 @param block 回调
 */
+ (void)createTableWithSQLName:(NSString *)sqlName andResultBlock:(void(^)(NSString *result))block
{
    NSString *jh;
    if ([db open]) {
        
        if ([db executeUpdate:sqlName]) {
            jh = @"创建表成功";
        }else{
            jh = @"创建表失败";
        }
        
        block(jh);
    }
    
}



/**
 增
 
 @param sqlName 表名
 @param block 回调
 */
+(void)insertSQLWithName:(NSString *)sqlName andResultBlocck:(void(^)(BOOL result))block
{
    BOOL jh;
    
    if ([db open]) {
        if ([db executeUpdate:sqlName]) {
            
            jh = YES;
        }else{
            
            jh = NO;
        }
        
        block(jh);
    }
    
}


/**
 删
 
 @param sqlName 表名
 @param block 回调
 */
+(void)deleteSQLWithName:(NSString *)sqlName andResultBlock:(void(^)(BOOL result))block
{
    BOOL jh;
    
    if ([db open]) {
        
        if ([db executeUpdate:sqlName]) {
            jh = YES;
        }else{
            jh = NO;
        }
        
        block(jh);
        
    }
    
}


/**
 更新
 
 @param sqlName 表名
 @param block 回调
 */
+(void)updateSQLWithName:(NSString *)sqlName andResultBlocck:(void (^)(BOOL result))block
{
    BOOL jh;
    
    if ([db open]) {
        
        if ([db executeUpdate:sqlName]) {
            jh = YES;
        }else{
            jh = NO;
        }
        
        block(jh);
        
    }
}


/**
 搜索一条数据
 
 @param sqlName 表名
 @param block 回调
 */
+(void)searchOneDataWithSQL:(NSString *)sqlName andResultBlock:(void (^)(BOOL result, NSDictionary *dict))block
{
    BOOL result = NO;
    
    //desc 降序---asc 升序
    //ex:NSString *sql=@"select *from 表 order by 查询字段 asc";
    
    if ([db open]) {
        
        //将查询到的数据放到FMResultSet里
        FMResultSet *set = [db executeQuery:sqlName];
        
        NSMutableDictionary *goodsDict = [NSMutableDictionary dictionary];
        
        if ([set next]) {
            
            result = YES;
            [goodsDict setObject:[set stringForColumn:@"goodsId"] forKey:@"goodsId"];
            [goodsDict setObject:[set stringForColumn:@"goodsName"] forKey:@"goodsName"];
            [goodsDict setObject:[set stringForColumn:@"goodsPrice"] forKey:@"goodsPrcie"];
            [goodsDict setObject:@([set intForColumn:@"goodsNum"]) forKey:@"goodsNum"];
        }
        
        block(result,goodsDict);
    }
}


/**
 搜索所有数据
 
 @param sqlName 表名
 @param block 回调
 */
+(void)searchAllDataWithSQL:(NSString *)sqlName andResultBlock:(void (^)(BOOL success, NSMutableArray *goodList))block
{
    BOOL success = NO;
    if ([db open]) {
        
        FMResultSet *set = [db executeQuery:sqlName];
        
        NSMutableArray *list = [NSMutableArray array];
        
        while ([set next]) {
            
            success = YES;
            
            ShopModel *model = [ShopModel new];
            
            model.goodsId = [set objectForColumnName:@"goodsId"];
            model.goodsName = [set objectForColumnName:@"goodsName"];
            model.goodsPrice = [set objectForColumnName:@"goodsPrice"];
            model.goodsNum = [set intForColumn:@"goodsNum"];
            
            [list addObject:model];
        }
        
        block(success,list);
    }
}
五、Demo

当然是在我的GitHub里呀~

相关文章

  • iOS 本地购物车缓存&应用于实际项目中

    前言:enmmmmm......之前写了iOS 购物车本地缓存基于FMDB的实现&Demo,但是当真正结合使用到项...

  • iOS 购物车本地缓存基于FMDB的实现&Demo

    需求:做一个本地购物车的缓存,来实现下一次打开app,购物车里依旧有商品,增强用户体验实现:利用FMDB、进行简单...

  • Swift-FMDB实战

    iOS中如果本地缓存数据库使用的SQLite,绝大数人都使用了FMDB,可以算是标配.如果自己对SQLite原生态...

  • 2019-08-25WKWebView踩坑1.0

    实现JS读取iOS本地写入的LocalStorage 判断清除缓存 配置webView 设置 WKProcessP...

  • iOS缓存工具封装

    日常中我们通常使用UserDefaults FMDB FileManager 等等方式去进行本地缓存的操作. 首先...

  • 自己实现缓存

    LRU缓存实现(Java)java实现本地缓存

  • 电商资料收集

    iOS 用10行代码实现购物车缓存http://www.jianshu.com/p/fe810b7f626e 数据...

  • Java基于LoadingCache实现本地缓存

    一、 添加maven依赖 二、CacheBuilder方法说明 1️⃣LoadingCache build(Cac...

  • 常用SDK

    AFNetworking网络请求组件SDWebImage多个缩略图缓存组件FMDB本地数据库组件UICKeyCha...

  • iOS自己动手写Cache

    需求:iOS 客户端和Rest服务端交互,需要将服务器端的数据缓存到本地以便离线访问。 实现: 实现缓存的种类有很...

网友评论

    本文标题:iOS 购物车本地缓存基于FMDB的实现&Demo

    本文链接:https://www.haomeiwen.com/subject/yyoimftx.html