FMDB 粗译 (未完成)

FMDB笔记

Git上的官方文档翻译

1. Usage

FMDB中有三个主要的类:

  1. FMDatabase - 表示一个单独的 SQLite 数据库, 用来执行 SQL 语句
  2. FMResultSet - FMDataBase执行了查询以后用来显示结果的类
  3. FMDatabaseQueue - 如果你以多线程的方式进行一些查询操作或者更新操作, 那么你可以用这个类, 后面的 “线程安全” 部分对此有详细描述

2. 创建数据库

一个 FMDatabase 可以通过一个 SQLite 数据库文件的路径创建. 这种路径可以是以下三种之一:

  1. 一个文件的系统路径. 文件可以不必要存在于硬盘(磁盘)中. 如果不存在, 就会创建一个.
  2. 一个空路径( @“”). 这时候会在一个临时位置创建一个空的数据库. 当 FMDataBase 的连接被关闭的时候, 这个数据库就会被删除掉.
  3. NULL. 这时候会创建一个内存内的数据库. 这个数据库也会在 FMDataBase 连接被关闭的时候销毁掉.

(想获取更多关于临时数据库和内存内数据的信息, 可以在这个关于 SQLite 的课题的文档中获取到: http://www.sqlite.org/inmemorydb.html)

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

打开数据库

数据库首先得打开才能和用户进行交互. 资源问题或者权限问题都会导致打开或者创建数据库失败

if (![db open]) {
[db release\\];
return;
}

更新操作

任何一种不属于 SELECT 的 SQL 语句都可以称之为一个 Update. Update 包括 CREATE, UPDATE, INSERT, ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, 和 REPLACE 语句(还有更多). 一般来讲, 如果你的 SQL 语句没有以 SELECT 开头, 那么就属于 Update 语句

执行一个 Update 只会返回一个值, 一个 BOOL 值. 返回的是 YES 代表着 Update 操作执行成功, 返回值为 NO 说明发生了一些错误. 你可能需要使用 -lastErrorMessage-lastErrorCode 方法来获取更多的消息

查询操作

一条 SELECT 语句就是一个查询可以通过使用 -executeQuery… 方法来执行查询

如果查询成功, 就会返回一个 FMResultSet 对象, 失败则会返回 nil. 想要知道查询是为什么失败, 你应该使用 -lastErrorMessage-lastErrorCode 这两个方法

使用 while() 循环来重复获取查询结果. 你也可能需要使用 “ step” 从一个 record 跳转到另一个 record. 在 FMDB 下, 你可以很容易的通过以下代码实现

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
  • dateForColumn
  • dataForColumn
  • dataNoCopyForColumn
  • UTF8StringForColumnName
  • objectForColumnName

上面的每一个方法都有一个对应的 {type}ForColumnIndex: 变体来获取查询返回的column中对应的位置的数据, (index)正好与上面的column’name的相反

需要注意的是, 你不需要亲自去 -close 一个 FMResultSet, 当 result set 被 dealloc 了或者它的父级数据库被关闭的时候其实就已经被关闭了

数据库关闭

当你执行完一次查询以后并且在数据库那边进行了更新, 你应该调用 -close 来关闭 FMDataBase 连接, 接着 SQLite 就会抛弃(?)掉在之前操作过程所请求的所有资源

[db close];

事务

FMDataBase 可以通过调用合适的方法或者执行一个 开始/结束 transaction 语句来开始和提交一个 transaction

多个操作

通过使用 FMDataBase 的 executeStatements: withResultBlock: 以字符串的形式来一次性执行多个操作

NSString *sql = @"create table bulktest1 (id integer primary key autoincrement, x text);"
                 "create table bulktest2 (id integer primary key autoincrement, y text);"
                 "create table bulktest3 (id integer primary key autoincrement, z text);"
                 "insert into bulktest1 (x) values (‘XXX‘);"
                 "insert into bulktest2 (y) values (‘YYY‘);"
                 "insert into bulktest3 (z) values (‘ZZZ‘);";

success = [db executeStatements:sql];

sql = @"select count(*) as count from bulktest1;"
       "select count(*) as count from bulktest2;"
       "select count(*) as count from bulktest3;";

success = [self.db executeStatements:sql withResultBlock:^int(NSDictionary *dictionary) {
    NSInteger count = [dictionary[@"count"] integerValue];
    XCTAssertEqual(count, 1, @"expected one record for dictionary %@", dictionary);
    return 0;
}];

数据净化

当你向 FMDB 提交一个 SQL 操作的时候, 不要试图在插入操作之前”净化” 任何数值. 相反, 你应该使用标准的 SQLite 绑定语法:

INSERT INTO myTable VALUES (?, ?, ?, ?)

SQLite 会自动把 “?” 识别为插入操作的数值占位符.™

时间: 2024-10-12 23:44:54

FMDB 粗译 (未完成)的相关文章

Core Bluetooth Programming Guide - Performing Common Peripheral Role Tasks 粗译

Core Bluetooth Programming Guide 粗译 续 code {padding:0.2em 0.4em; background:#e1e9ed;} pre {text-align:left; overflow-x: scroll; color: #d3bd7e; background: #202020; padding: 10pt 15pt; border-radius: 3px;} hr {border: 0px; border-top: 1px solid #ddd;

Core Bluetooth Programming Guiding - Performing Common Central Role Tasks 粗译

CoreBluetooth的部分翻译 执行常见的Central任务 充当Central的角色并且遵循BLE通讯的设备可以执行一系列通用任务— — 比如, 发现并连接可用的Peripherals,  探索Peripheral提供的数据并与之进行交互. 充当Peripheral的角色的设备也能执行一些列的任务, 但是任务内容正好跟Central不同, 甚至相反——比如, 发布并广告services, 相应外界的读写操作, 已经从已连接的Central那订阅请求 你将在这一章节里学会去如何使用 Cor

程序员翻译技术类书籍的总结

2013年到现在,已经翻译了3本书了,其它杂七杂八的文章也不少.其中有一些经验和教训,势必要总结一下. 将译稿纳入版本管理 没有版本管理的代码修改起来是战战兢兢地,而译稿也类似.我习惯在GitHub上创建一个私有的仓库(我是GitHub的会员),把与该书相关的内容都放置上去,每翻译一点就迁入一次,保证任何修改都可以追踪. 创建一个词条文档 在翻译书的过程中,难免会遇到很多专业词汇,有些专业词汇有统一的翻译,而有些则没有,需要自己权衡后给出一个翻译结果.最好把这些词汇都放置到一个独立文档中,这尤其

Openstack组件部署 — Nova_Install and configure a compute node

目录 目录 前文列表 Prerequisites 先决条件 Install and configure a compute node Install the packages Edit the etcnovanovaconf file Finalize installation 前文列表 Openstack组件部署 - Overview和前期环境准备 Openstack组建部署 - Environment of Controller Node Openstack组件部署 - Keystone功能

Openstack组建部署 — Glance Install

目录 目录 前文列表 Image service overview Openstack Image service包含的组件 Install and configure Prerequisites 先决条件 To create the database To create the service credentials Install and configure components Install the packages Edit the etcglanceglance-apiconf fi

对九个超级程序员的采访

对九个超级程序员的采访 原文:<Q&A With Nine Great Programmers>时间有限,我只能粗译,难免错误. 这篇访谈源自2006年,最先发布在波兰程序员 Jaroslaw “sztywny” Rzeszótko (AKA “Stiff”) 的博客上.但是这篇博文现在找不到了.非常感谢他能授权我重新发布这个博文. 在一个炎热无聊的下午,我突发奇想.我想通过电子邮件的方式对那些我非常感兴趣和非常敬重的程序员问10个问题.准备这10个问题我只花了5分钟,这些都是我个人想

Goroutine是如何工作的

转自:http://tonybai.com/2014/11/15/how-goroutines-work/ 在golangweekly的第36期Go Newsletter中我发现一篇短文"How Goroutines Work" ,其作者在参考了诸多资料后,简短概要地总结了一下 Goroutine的工作原理,感觉十分适合刚入门的Gophers(深入理解Goroutine调度的话,可以参考Daniel Morsing的"The Go scheduler" ).这里粗译

2018,全新出发(全力推动实现住有所居)

2013-停止了写博自2013年写完<系统架构师-基础到企业应用架构-分层[上篇]>后便停止写博客了,至今快5年了,现在突然想写的时候,却又发现迟迟无法下手打字,细心思考感触颇多,这5年对于我来说经历了太多,也成长了许多,职业发展的路径可以说是连绵曲折,但过程中也收获颇丰,人生便是历练,感谢这样的机遇,让我慢下来,重新思考.全新出发. 鄙人有幸参与并见证了互联网.移动互联网.人工智能.云计算.大数据.区块链等技术的兴起.蓬勃发展及成熟.也逐步被科技改变生活的习惯及方式,每天看电脑手机的时间超过

译:Spring框架参考文档之IoC容器(未完成)

6. IoC容器 6.1 Spring IoC容器和bean介绍 这一章节介绍了Spring框架的控制反转(IoC)实现的原理.IoC也被称作依赖注入(DI).It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, o