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

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

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


    iOS 购物车本地缓存基于FMDB的实现&Demo_第1张图片
    ShopCart1.gif
  • 退出app、关闭进程后,再次进入,读取数据库数据:


    iOS 购物车本地缓存基于FMDB的实现&Demo_第2张图片
    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 购物车本地缓存基于FMDB的实现&Demo)