最近项目要用到数据库,采用的是第三方FMDB, 之前做C#时用过sqlHelper,自己就按着sqlHelper的思路封装了一下,封装的也比较简单,看到网上有一些根据FMDB封装的ORM框架,但基本都是单表的.

按着ADO.Net的思路

1.连接数据库

2.打开数据库

3.操作数据库

4.关闭数据库

在使用查询数据时FMResultSet 用next遍历时不能关闭数据库

#import <Foundation/Foundation.h>
#import "FMDB.h"

@interface FMDBManager : NSObject

-(BOOL)updateDataBase:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;

-(void)openDatabase;

-(void)closeDatabase;

-(FMResultSet *)QueryDataBase:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;

-(BOOL)updateDataBaseInTransaction:(NSArray *)sqlArray;

@end
//
//  FMDBManager.m
//  XQBCommunityApp
//
//  Created by City--Online on 16/1/14.
//  Copyright © 2016年 CityOnline_1. All rights reserved.
//

#import "FMDBManager.h"
#import "FMDB.h"
#import <sqlite3.h>
/**
 *  数据库名字
 */
#define XQB_DB_NAME       @"XqbDB.sqlite"
#define XQB_DB_PATH       @"XqbDbDir"

@interface FMDBManager ()
@property (nonatomic,strong) NSString *tablePath;
@property (nonatomic,strong) FMDatabase *database;
@end
@implementation FMDBManager

- (void)connectDataBase
{
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
    NSString *databasePath = [NSString stringWithFormat:@"%@/%@", pathDocuments,XQB_DB_PATH];

    // 判断文件夹是否存在,如果不存在,则创建
    if (![[NSFileManager defaultManager] fileExistsAtPath:databasePath]) {
        [fileManager createDirectoryAtPath:databasePath withIntermediateDirectories:YES attributes:nil error:nil];
    } else {
        NSLog(@"FileDir is exists.");
    }
    //获取数据库 的路径
    _tablePath = [NSString stringWithFormat:@"%@/%@",databasePath,XQB_DB_NAME];
    _database = [FMDatabase databaseWithPath:_tablePath];
    NSLog(@"%@",_tablePath);
}

-(BOOL)updateDataBase:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
{
    return [_database executeUpdate:sql withArgumentsInArray:arguments];
}

-(FMResultSet *)QueryDataBase:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
{
    FMResultSet *set=nil;
    set=[_database executeQuery:sql withArgumentsInArray:arguments];
    return set;
}

-(void)openDatabase
{
    //创建数据库
    [self connectDataBase];
    [_database open];
}
-(void)closeDatabase
{
    [_database close];
}

-(BOOL)updateDataBaseInTransaction:(NSArray *)sqlArray
{
    BOOL success=YES;
    [self connectDataBase];
     sqlite3 *db=nil;
    @try {
        char *errmsg=NULL;
        int result=sqlite3_open(_tablePath.UTF8String, &db);
        if (result==SQLITE_OK) {
            if (sqlite3_exec(db, "begin", NULL, NULL, &errmsg)==SQLITE_OK) {
                sqlite3_free(errmsg);
                sqlite3_stmt *stmt=NULL;
                //执行事务
                for (NSString *str in sqlArray) {
                    , &stmt, NULL)==SQLITE_OK) {
                        if (sqlite3_step(stmt)!=SQLITE_DONE) {
                            sqlite3_finalize(stmt);
                        }
                    }
                }
                //提交事务
                if (sqlite3_exec(db, "commit", NULL, NULL, &errmsg)==SQLITE_OK) {
                    sqlite3_free(errmsg);
                }
            }
        }
        sqlite3_close(db);
    }
    @catch (NSException *exception) {
        char *errmsg=NULL;
        if (sqlite3_exec(db, "rollback", NULL, NULL, &errmsg)==SQLITE_OK) {
            success=NO;
        }
    }
    @finally {

    }
    return success;
}

@end

数据存储之第三方FMDB优化的更多相关文章

  1. 数据存储之第三方FMDB

    上周四.周五在忙公司的事情和炒股,没来得及更新博客,这周就补一下,学习总结下FMDB. FMDB是对sqlite的封装,特别是在多线程情况下,使用sqlite是非常麻烦,而使用FMDB相对简单,下面是 ...

  2. TI C6000 数据存储处理与性能优化

    存储器之于CPU好比仓库之于车间.车间加工过程中的原材料.半成品.成品等均需入出仓库,生产效率再快,如果仓库周转不善,也必然造成生产阻塞.如同仓库需要合理地规划管理一般,数据存储也需要恰当的处理技巧来 ...

  3. IOS 数据存储之 FMDB 详解

    FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过 ...

  4. IOS数据存储之FMDB数据库

    前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...

  5. 移动互联网实战--资源类APP的数据存储处理和优化

    前言: 对于资源类的APP, 其音频/图形占据了APP本身很大的比例. 如何存储和管理这些资源文件, 成了一个颇具挑战性的难点. 移动端的碎片化, 高中低端手机的并存, 需要开发者不光是具备基础的存储 ...

  6. ByteArrary(优化数据存储和数据流)

    原地址:http://www.unity蛮牛.com/blog-1801-799.html 首页 博客 相册 主题 留言板 个人资料   ByteArrary(优化数据存储和数据流) 分类:unity ...

  7. 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等

    (1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...

  8. 性能优化之数据存储&DOM编程

    多读书多看报 数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员.   ·要理解变量的访问速度,就要理解作用域. ...

  9. 在AndroidStudio中数据存储第三方数据管理Bmob的使用

    ---恢复内容开始--- 在日常写代码的过程中我们比较痛苦的就是数据库的建立和使用,那么今天来介绍一下一个第三方的数据管理平台Bmonb. 一.我们首先进入Bmob的官网创建一个账号 Bome官网网址 ...

随机推荐

  1. WPF:MVVM模式下ViewModel关闭View

    不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnabl ...

  2. 3. Python的种类

  3. django系列5.2--ORM数据库的单表操作

    单表操作 在views.py中添加对数据库的操作语句 #在逻辑代码中导入你要操作的表 from app import models def add_book(request): ''' 添加表记录 : ...

  4. Delphi XE7实现的任意位置弹出菜单

    Delphi XE7中目前还没有弹出菜单组件,这个弹出菜单应用很普遍,在JAVA开发的安卓程序中很简单就可以用上了,应该说是一个标准控件.看了一些例子,但是都不能满足我想在任意位置弹出菜单需求,于是自 ...

  5. 深入了解java虚拟机(JVM) 第八章 常见的jvm调优策略

    一般来说,jvm的调优策略是没有一种固定的方法,只有依靠我们的知识和经验来对项目中出现的问题进行分析,正如吉德林法则那样当你已经把问题清楚写出来,就已经解决了一半.虽然JVM调优中没有固定的策略,但是 ...

  6. WEB H5 JS QRCode二维码快速自动生成

    万能的GITHUB: https://github.com/davidshimjs/qrcodejs HTML: <div class="col-xs-10 col-xs-offset ...

  7. 查看python中已安装的包

    pip list 现在我又知道了个:rpm -qa | grep XXXX(moudle name)

  8. redis cluster 的ERR max number of clients reached 问题排查

    早上发现微服务连不上redis cluster了,看来下日志如下 [root@win-jrh378d7scu 7005]# bin/redis-cli -c -h 15.31.213.183 -p 7 ...

  9. python接口自动化2-发送post请求详解(二)

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  10. 哈工大ComingX-创新工场俱乐部正式成立

    当我把这两个Logo放在一起的时候,我有一种感觉,这种感觉同样存在于ComingX队员的心中.大学我们走到了一起,非你我所预料,却又如此自然.在感恩节的零点,我迫不及待地告诉各位ComingX队员和关 ...