郝萌主倾心贡献。尊重作者的劳动成果,请勿转载。

假设文章对您有所帮助,欢迎给作者捐赠。支持郝萌主,捐赠数额任意,重在心意^_^

我要捐赠: 点击捐赠

Cocos2d-X源代码下载:点我传送

因为FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍。

与此同一时候,把SQLite的文档页
http://www.sqlite.org/docs.html 加到你的书签中。

自己主动引用计数(APC)还是手动内存管理呢?

两种都行,FMDB会在编译的时候知道你是用的哪一种,然后进行对应处理。

用法



FMDB有三个基本的类



    FMDatabase – 表示一个单独的SQLite数据库。 用来运行SQLite的命令。

    FMResultSet – 表示FMDatabase运行查询后结果集

    FMDatabaseQueue – 假设你想在多线程中运行多个查询或更新。你应该使用该类。这是线程安全的。



数据库创建



创建FMDatabase对象时參数为SQLite数据库文件路径。该路径能够是下面三种之中的一个:

文件路径。该文件路径无需真实存,假设不存在会自己主动创建。

空字符串(@”")。表示会在暂时文件夹创建一个空的数据库,当FMDatabase 链接关闭时,文件也被删除。

NULL. 将创建一个内在数据库。

相同的。当FMDatabase连接关闭时,数据会被销毁。

(如需对暂时数据库或内在数据库进行一步了解,请继续阅读:http://www.sqlite.org/inmemorydb.html)





    FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];  



打开数据库



在和数据库交互 之前,数据库必须是打开的。假设资源或权限不足无法打开或创建数据库。都会导致打开失败。





    if (![db open]) {  

        [db release];  

        return;  

    }  



运行更新



一切不是SELECT命令的命令都视为更新。

这包含  CREATE, UPDATE, INSERT,ALTER,

 COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE  (等)。

简单来说,仅仅要不是以SELECT开头的命令都是UPDATE命令。

运行更新返回一个BOOL值。YES表示运行成功,否则表示有那些错误 。

你能够调用 -lastErrorMessage 和 -lastErrorCode方法来得到很多其它信息。

运行查询



SELECT命令就是查询,运行查询的方法是以 -excuteQuery开头的。

运行查询时。假设成功返回FMResultSet对象, 错误返回nil. 与运行更新相当。

支持使用 NSError**參数。同一时候,你也能够使用 -lastErrorCode和-lastErrorMessage获知错误信息。

为了遍历查询结果,你能够使用while循环。你还须要知道怎么跳到下一个记录。

使用FMDB。非常easy实现。就像这样:

FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];  

    while ([s next]) {  

        //retrieve values for each record  

    }  



你必须一直调用   -[FMResultSet next]   在你訪问查询返回值之前,甚至你仅仅想要一个记录:







    FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];  

    if ([s next]) {  

         int totalCount = [s intForColumnIndex:0];  

    }  



FMResultSet  提供了非常多方法来获得所需的格式的值:



    intForColumn:

    longForColumn:

    longLongIntForColumn:

    boolForColumn:

    doubleForColumn:

    stringForColumn:

    dataForColumn:

    dataNoCopyForColumn:

    UTF8StringForColumnIndex:

    objectForColumn:



这些方法也都包含 {type}ForColumnIndex 的这样子的方法,參数是查询结果集的列的索引位置。



你无需调用  [FMResultSet close]来关闭结果集, 当新的结果集产生,或者其数据库关闭时,会自己主动关闭。

关闭数据库



当使用完数据库。你应该 -close 来关闭数据库连接来释放SQLite使用的资源。



    [db close];  



事务



FMDatabase是支持事务的。

数据净化(数据格式化)



使用FMDB。插入数据前,你不要花时间审查你的数据。你能够使用标准的SQLite数据绑定语法。

INSERT INTO myTable VALUES (?, ?, ?)  



SQLite会识别 “?” 为一个输入的点位符。 这种运行会接受一个可变參数(或者表示为其它參数。如NSArray, NSDictionary,或va_list等)。会正确为您转义。

你也能够选择使用命名參数语法。



    INSERT INTO myTable VALUES (:id, :name, :value)  



參数名必须以冒名开头。

SQLite本身支持其它字符,当Dictionary key的内部实现是冒号开头。

注意你的NSDictionary key不要包括冒号。





    NSDictionary *argsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"My Name", @"name", nil];  


    [db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)" withParameterDictionary:argsDict];  



并且,代码不能这么写(为什么?想想吧。)





[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has \" lots of ' bizarre \" quotes '"];



你应该:





    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has " lots of ' bizarre " quotes '"];  



提供给 -executeUpdate: 方法的參数都必须是对象。就像下面的代码就无法工作,且会产生崩溃。





    [db executeUpdate:@"INSERT INTO myTable VALUES (?

)", 42];  



正确有做法是把数字打包成 NSNumber对象





    [db executeUpdate:@"INSERT INTO myTable VALUES (?

)", [NSNumber numberWithInt:42]];  



或者,你能够使用  -execute*WithFormat: 。这是NSString风格的參数





    [db executeUpdateWithFormat:@"INSERT INTO myTable VALUES (%d)", 42];  



-execute*WithFormat:  的方法的内部实现会帮你封装数据, 下面这些修饰符都能够使用: %@, %c, %s, %d, %D,

%i, %u, %U, %hi, %hu, %qi, %qu, %f, %g, %ld, %lu, %lld, and %llu.  除此之外的修饰符可能导致无法预知的结果。

一些情况下,你须要在SQL语句中使用 % 字符,你应该使用 %%。

使用FMDatabaseQueue 及线程安全



在多个线程中同一时候使用一个FMDatabase实例是不明智的。

如今你能够为每一个线程创建一个FMDatabase对象。

不要让多个线程分享同一个实例。它无法在多个线程中同一时候使用。 若此,坏事会常常发生,程序会时不时崩溃,

或者报告异常,或者陨石会从天空中掉下来砸到你Mac Pro.  总之非常崩溃。

所以,不要初始化FMDatabase对象,然后在多个线程中使用。

请使用 FMDatabaseQueue,它是你的朋友并且会帮助你。

下面是用法:

首先创建队列。

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

这样使用。





    [queue inDatabase:^(FMDatabase *db) {  

              [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];  


              [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];  


              [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];  

              FMResultSet *rs = [db executeQuery:@"select * from foo"];  

             while([rs next]) {  

                …  

             }  

    }];  



像这样,轻松地把简单任务包装到事务里:





    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {  

            [db executeUpdate:@"INSERT INTO myTable VALUES (?

)", [NSNumber numberWithInt:1]];  


            [db executeUpdate:@"INSERT INTO myTable VALUES (?

)", [NSNumber numberWithInt:2]];  


            [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];  


            if (whoopsSomethingWrongHappened) {  

                    *rollback = YES; return;  

            }  

            // etc…  

            [db executeUpdate:@"INSERT INTO myTable VALUES (?

)", [NSNumber numberWithInt:4]];  


    }];

FMDatabaseQueue  后台会建立系列化的GCD队列,并运行你传给GCD队列的块。

这意味着你从多线程同一时候调用调用方法,GCD也会按它接收的块的顺序来运行。

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

假设文章对您有所帮助。欢迎给作者捐赠,支持郝萌主。捐赠数额任意,重在心意^_^

我要捐赠: 点击捐赠

Cocos2d-X源代码下载:点我传送

版权声明:本文博客原创文章,博客,未经同意,不得转载。

FMDB与GCD的更多相关文章

  1. iOS中FMDB和GCD剖析

    转载至:http://www.cocoachina.com/industry/20130819/6821.html 英文链接:https://github.com/ccgus/fmdb 由于FMDB是 ...

  2. iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转)

    由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQLite的文档页 http://www.sqlite.org/docs.html 加到你的书签中.自动 ...

  3. FMDB官方使用文档-GCD的使用-提高性能(翻译)

    FMDB官方使用文档-GCD的使用-提高性能(翻译) 发布于:2013-08-19 10:01阅读数:13395 由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此 ...

  4. FMDB官方使用文档 G-C-D的使用 提高性能(翻译)

    由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQLite的文档页 加到你的书签中.自动引用计数(APC)还是手动内存管理呢?   两种都行,FMDB会 ...

  5. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  6. 使用FMDB多线程访问数据库,及database is locked的问题

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizi ...

  7. iOS:转载FMDB文档

    来自会员pengtao的分享:(原文:https://github.com/ccgus/fmdb) 由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQL ...

  8. FMDB使用(转载)

    来自会员pengtao的分享:(原文:https://github.com/ccgus/fmdb) 由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQL ...

  9. FMDB的线程安全

    最近面试被问到FMDB的多线程处理问题,因为之前项目中是移植别人的代码,没有踩过这里的坑. 问题: 多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finaliz ...

随机推荐

  1. 使用 WPF 实现所见即所得HTML编辑器

    Introduction In this tip, you will learn the use of WPF webbrowser control and the use of the librar ...

  2. git commit -s -m 注释中的换行 [加入signed-off-by

    windows环境下的Git Bash中注释的换行: 使用单引号. 或者是在Linux系统里面用终端 git add . git commit -m ' . this is the test . up ...

  3. Swift语法学习之 类和结构体

    类和结构体 本页包括内容: 类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合(collection)类型的赋值与复制行为 与其他编程语言所不同的是,Swift 并不要求你为自 ...

  4. python K-means工具包初解

    近期数据挖掘实验,写个K-means算法,写完也不是非常难,写的过程中想到python肯定有包,尽管师兄说不让用,只是自己也写完了,而用包的话,还不是非常熟,略微查找了下资料,学了下.另外,自己本身写 ...

  5. 【Linux探索之旅】第二部分第二课:命令行,世界尽在掌握

    内容简介 1.第二部分第二课:命令行,世界尽在掌握 2.第二部分第三课预告:文件和目录,组织不会亏待你 命令行,世界尽在掌握 今天的标题是不是有点霸气侧漏呢? 读者:“小编,你为什么每次都要起这么非主 ...

  6. SDUTOJ 1298 活动选择

    #include<iostream> #include<memory.h> using namespace std; int a[105],b[105],c[105],d[10 ...

  7. Raw-OS互斥的源代码分析的量的Mutex

    作为分析的内核版本2014-04-15,基于1.05正式版.blogs我们会跟上的内核开发进度的最新版本,如果出现源代码的目光"???"的话,没有深究的部分是理解. Raw-OS官 ...

  8. COCOS2D-X FRAME动画创作随笔

    CCAnimate继承CCActionInterval,和CCAnimate是一家action,有着action所有的属性和方法. CCAnimate一些重要的方法: static CCAnimate ...

  9. shuffle一个简单的过程叙述性说明

    shuffle它是在map和reduce过程之间.我们看看在这个过程中的步骤,了解在这个问题上不深,有可能是一个错误.忘记修正 1. map map出口key,value,里的context.writ ...

  10. Servlet上传文件

    Servlet上传文件 1.准备工作 (1)利用FileUpload组件上传文件,须要到apache上下载commons-fileupload-1.3.1.jar 下载地址:http://common ...