https://github.com/Joker-King/JKDBModel

1.将FMDB和DBModel拖入项目中,然后添加libsqlite3.dylib

 
2.

#import "JKDBModel.h"
@interface WrksheetInfoModel : JKDBModel

3./** 数据库中是否存在表 */

+ (BOOL)isExistInTable;

/** 保存或更新 * 如果不存在主键,保存, * 有主键,则更新 */

- (BOOL)saveOrUpdate;

/** 保存单个数据 */

- (BOOL)save;

/** 批量保存数据 */

+ (BOOL)saveObjects:(NSArray *)array;

/** 更新单个数据 */

- (BOOL)update;

/** 批量更新数据*/

+ (BOOL)updateObjects:(NSArray *)array;

/** 删除单个数据 */

- (BOOL)deleteObject;

/** 批量删除数据 */

+ (BOOL)deleteObjects:(NSArray *)array;

/** 通过条件删除数据 */

+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria;

/** 清空表 */

+ (BOOL)clearTable;/** 查询全部数据 */+ (NSArray *)findAll;

/** 通过主键查询 */

+ (instancetype)findByPK:(int)inPk;

/** 查找某条数据 */

+ (instancetype)findFirstByCriteria:(NSString *)criteria;

/** 通过条件查找数据 * 这样可以进行分页查询 @" WHERE pk > 5 limit 10" */

+ (NSArray *)findByCriteria:(NSString *)criteria;

/** * 创建表 * 如果已经创建,返回YES */

+ (BOOL)createTable;#pragma mark - must be override method

/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写 */

+ (NSArray *)transients;

4.使用示例

#pragma mark - 插入数据
/** 创建多条子线程 */
- (IBAction)insertData:(id)sender {
    for (int i = 0; i < 1; i++) {
        User *user = [[User alloc] init];
        user.name = [NSString stringWithFormat:@"麻子%d",i];
        user.sex = @"男";
        user.age = 10+i;
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [user save];
        });
    }
}

/** 子线程一:插入多条用户数据 */
- (IBAction)insertData2:(id)sender {

    dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);
    dispatch_async(q1, ^{
        for (int i = 0; i < 5; ++i) {
            User *user = [[User alloc] init];
            user.name = @"赵五";
            user.sex = @"女";
            user.age = i+5;
            [user save];
        }
    });
}

- (IBAction)insertData3:(id)sender {
    for (int i = 0; i < 1000; ++i) {
        User *user = [[User alloc] init];
        user.name = @"张三";
        user.sex = @"男";
        user.age = i+5;
        [user save];
    }
}

/** 子线程三:事务插入数据 */
- (IBAction)insertData4:(id)sender {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i < 500; i++) {
            User *user = [[User alloc] init];
            user.name = [NSString stringWithFormat:@"李四%d",i];
            user.age = 10+i;
            user.sex = @"女";
            [array addObject:user];
        }
        [User saveObjects:array];
    });
}

#pragma mark - 删除数据
/** 通过条件删除数据 */
- (IBAction)deleteData:(id)sender {
//    [User deleteObjectsByCriteria:@" WHERE pk < 10"];
    [User deleteObjectsWithFormat:@"Where %@ < %d",@"pk",10];
}

/** 创建多个线程删除数据 */
- (IBAction)deleteData2:(id)sender {
    for (int i = 0; i < 5; i++) {
        User *user = [[User alloc] init];
        user.pk = 1+i;
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [user deleteObject];
        });
    }
}

/** 子线程用事务删除数据 */
- (IBAction)deleteData3:(id)sender {

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i < 500; i++) {
            User *user = [[User alloc] init];
            user.pk = 501+i;
            [array addObject:user];
        }
        [User deleteObjects:array];
    });
}

#pragma mark - 修改数据
/** 创建多个线程更新数据 */
- (IBAction)updateData1:(id)sender {
    for (int i = 0; i < 5; i++) {
        User *user = [[User alloc] init];
        user.name = [NSString stringWithFormat:@"更新%d",i];
        user.age = 120+i;
        user.pk = 5+i;
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [user update];
        });
    }
}

/**单个子线程批量更新数据,利用事务 */
- (IBAction)updateData:(id)sender {
    dispatch_queue_t q3 = dispatch_queue_create("queue3", NULL);
    dispatch_async(q3, ^{
        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i < 500; i++) {
            User *user = [[User alloc] init];
            user.name = [NSString stringWithFormat:@"啊我哦%d",i];
            user.age = 88+i;
            user.pk = 10+i;
            [array addObject:user];
        }
        [User updateObjects:array];
    });
   
}

#pragma mark - 查询
/** 查询单条记录 */
- (IBAction)queryData1:(id)sender {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"第一条:%@",[User findFirstByCriteria:@" WHERE age = 20 "]);
    });
}

/**  条件查询多条记录 */
- (IBAction)queryData2:(id)sender {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"小于20岁:%@",[User findByCriteria:@" WHERE age < 20 "]);
    });
}

/** 查询全部数据 */
- (IBAction)queryData3:(id)sender {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"全部:%@",[User findAll]);
    });
}

/** 分页查询数据 */
- (IBAction)queryData:(id)sender {
    static int pk = 5;
    NSArray *array = [User findByCriteria:[NSString stringWithFormat:@" WHERE pk > %d limit 10",pk]];
    pk = ((User *)[array lastObject]).pk;
    NSLog(@"array:%@",array);
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSString *title = @"查询";
    int type = 3;
    if ([segue.identifier isEqualToString:@"One"]) {
        title = @"查询一条数据";
        type = 1;
    } else if ([segue.identifier isEqualToString:@"Two"]){
        title = @"条件查询";
        type = 2;
    }else if ([segue.identifier isEqualToString:@"Three"]){
        title = @"查询全部";
        type = 3;
    }else if ([segue.identifier isEqualToString:@"Four"]){
        title = @"分页查询";
        type = 4;
    }
   
    QueryTableViewController *destVC = segue.destinationViewController;
    destVC.title = title;
    destVC.type = type;
}

 
 
如果模型属性中包含数组或者字典,需要做如下操作:
1.模型属性全部用NSString修饰
2.模型属性赋值时
  model.orderHisInfo = [[NSString alloc] initWithData:[UtilitytoJSONData:dic[@"orderHisInfo”]] encoding:NSUTF8StringEncoding]; //查看进程
3.取值时,取出来是数组或者字典
  [Utility toArrayOrNSDictionary:[self.model.orderHisInfo dataUsingEncoding:NSUTF8StringEncoding]];

// 将JSON串转化为字典或者数组  数组转换字符串
+ (id)toArrayOrNSDictionary:(NSData *)jsonData{
    NSError *error = nil;
    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData
                                                   options:NSJSONReadingMutableContainers
                                                      error:&error];
   
    if (jsonObject != nil && error == nil){
        return jsonObject;
    }else{
        // 解析错误
        return nil;
    }
   
}

// 将字典或者数组转化为JSON串
+ (NSData *)toJSONData:(id)theData{
   
    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:theData
                                                      options:NSJSONWritingPrettyPrinted
                                                         error:&error];
    NSLog(@"%@", jsonData);
   
    if ([jsonData length] != 0 && error == nil){
        return jsonData;
    }else{
        return nil;
    }
}

iOS---基于对Sqlilte3的二次包装的第三次包装--->JKDBModel ,一个好用的离线缓存库的更多相关文章

  1. IOS基于XMPP协议开发--XMPPFramewok框架(三):用户注册

    接着上面说 用户注册是比较简单的,成功连接上服务器后,设置好JID,即可调用 [_xmppStream registerWithPassword:pwd error:&err] 进行注册 -( ...

  2. IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

    最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...

  3. 基于memcached的单机轻量级通用缓存库minicached的实现

    一.前言 之前拜读过淘宝子柳的<淘宝技术这十年>之大作,深知缓存技术在系统优化中起着一个举足轻重的作用.无论是文件系统静态文件,数据库的访问,乃至网络数据的请求,只要是与内存访问速度相差较 ...

  4. iOS如何获取网络图片(二)

    ios如何获取图片(二)无沙盒下 解决问题 *解决问题1:tableView滑动卡顿,图片延时加载 解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI *解决问题2:反复请求网络图片,增加用 ...

  5. iOS开发Swift篇—(二)变量和常量

    iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...

  6. 【基于spark IM 的二次开发笔记】第一天 各种配置

    [基于spark IM 的二次开发笔记]第一天 各种配置 http://juforg.iteye.com/blog/1870487 http://www.igniterealtime.org/down ...

  7. iOS开发CoreAnimation解读之二——对CALayer的分析

    iOS开发CoreAnimation解读之二——对CALayer的分析 一.UIView中的CALayer属性 1.Layer专门负责view的视图渲染 2.自定义view默认layer属性的类 二. ...

  8. 提供基于Lesktop的IM二次开发,联系QQ:87172811

    提供基于Lesktop的IM二次开发,联系QQ:87172811

  9. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

随机推荐

  1. JavaWeb——Filter

    一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...

  2. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  3. 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  4. HTML kbd键盘元素

    1. 说明 kbd :即Keyboard Input Element(键盘输入元素).表示键盘按键的语义元素,常用于网页上对快捷键.按键说明的场景. 样式规格:内联样式. 为了在页面上突出显示,可以给 ...

  5. 有趣的 CSS 像素艺术

    原文地址:https://css-tricks.com/fun-times-css-pixel-art/#article-header-id-4 译者:nzbin 友情提示:由于国内网络的原因,Cod ...

  6. LeetCode[3] Longest Substring Without Repeating Characters

    题目描述 Given a string, find the length of the longest substring without repeating characters. For exam ...

  7. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  8. springMVC初探--环境搭建和第一个HelloWorld简单项目

    注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...

  9. Redis简单案例(二) 网站最近的访问用户

    我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...

  10. MySQL全文索引 FULLTEXT索引和like的区别

    1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...