转自http://blog.devtang.com/blog/2012/04/22/use-fmdb/ 还不错。过后我会自己写的放出来
在iOS开发中使用FMDB
APR 22ND, 2012
前言
SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK很早就支持了SQLite,在使用时,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。但是,原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,开源社区中就出现了一系列将SQLite API进行封装的库,而FMDB (https://github.com/ccgus/fmdb) 则是开源社区中的优秀者。
FMDB在使用上相当方便。以下是一个简单的例子:
1
2
3
4
5
6
7
8
9
10
11
|
NSString* docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* dbpath = [docsdir stringByAppendingPathComponent:@"user.sqlite"];
FMDatabase* db = [FMDatabase databaseWithPath:dbpath];
[db open];
FMResultSet *rs = [db executeQuery:@"select * from people"];
while ([rs next]) {
NSLog(@"%@ %@",
[rs stringForColumn:@"firstname"],
[rs stringForColumn:@"lastname"]);
}
[db close];
|
可以看到,使用FMDB后的数据库代码清晰明了,比原生的API优雅多了。另外,FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。
使用说明
该使用说明主要翻译自fmdb的github项目说明文档: https://github.com/ccgus/fmdb
引入相关文件
首先将FMDB从github上clone下来,然后将以下文件copy到你的工程中:
1
2
3
4
5
6
7
8
9
10
|
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMDatabasePool.h
FMDatabasePool.m
FMDatabaseQueue.h
FMDatabaseQueue.m
FMResultSet.h
FMResultSet.m
|
建立数据库
建立数据库只需要如下一行即可,当该文件不存在时,fmdb会自己创建一个。如果你传入的参数是空串:@”” ,则fmdb会在临时文件目录下创建这个数据库,如果你传入的参数是 NULL,则它会建立一个在内存中的数据库。
1
|
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
|
打开数据库
使用如下语句,如果打开失败,可能是权限不足或者资源不足。通常打开完操作操作后,需要调用close方法来关闭数据库。
1
2
3
4
5
6
7
8
|
if (![db open]) {
// error
return;
}
// some operation
// ...
[db close];
|
执行更新操作
除了Select操作之外,其它的都是更新操作。更新操作使用如下方法,如果有错误,可以用error参数中获得。
1
|
-[FMDatabase executeUpdate:error:withArgumentsInArray:orVAList:]
|
执行查询操作
查询操作示例如下。注意:即使操作结果只有一行,也需要先调用FMResultSet的next方法。
1
2
3
4
5
6
7
8
9
|
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
//retrieve values for each record
}
FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) {
int totalCount = [s intForColumnIndex:0];
}
|
FMDB提供如下多个方法来获取不同类型的数据:
1
2
3
4
5
6
7
8
9
10
11
|
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:
|
通常情况下,你并不需要关闭FMResultSet,因为相关的数据库关闭时,FMResultSet也会被自动关闭。
数据参数
通常情况下,你可以按照标准的SQL语句,用?表示执行语句的参数,如:
1
|
INSERT INTO myTable VALUES (?, ?, ?)
|
然后,可以我们可以调用executeUpdate方法来将?所指代的具体参数传入,通常是用变长参数来传递进去的,如下:
1
2
|
NSString *sql = @"insert into User (name, password) values (?, ?)";
[db executeUpdate:sql, user.name, user.password];
|
这里需要注意的是,参数必须是NSObject的子类,所以象int,double,bool这种基本类型,需要封装成对应的包装类才行,如下所示:
1
2
3
4
|
// 错误,42不能作为参数
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42];
// 正确,将42封装成 NSNumber 类
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];
|
线程安全
如果我们的app需要多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 切记不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用,这个类本身不是线程安全的,这样使用会造成数据混乱等问题。
使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// 创建,最好放在一个单例的类中
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]];
}];
|
工具
为了查看Sqlite中的数据,一个好的图形化界面的数据库管理程序是必不可少的。mysql有phpMyAdmin,那么sqlite呢?
我主要使用的是Firefox的一个名为SQLite Manager的插件,安装此插件后,可以直接打开后缀名为sqlite的数据库文件。SQLite Manager提供一个图形化的界面来执行数据查询或更改操作。如下图所示:
总结
FMDB将SQLite API进行了很友好的封装,使用上非常方便,对于那些使用纯Sqlite API来进行数据库操作的app,可以考虑将其迁移到基于FMDB上,这对于以后数据库相关功能的开发维护,可以提高不少效率。
我在学习fmdb的时候做了一个小工程用于练习,我把它放到github上了。感兴趣的可以自行下载:https://github.com/tangqiaoboy/FmdbSample
祝大家玩得开心。
Posted by 唐巧 Apr 22nd, 2012 iOS
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
分享到:
相关推荐
本教程将详细讲解如何在Swift项目中使用FMDB进行数据库的增、删、改、查操作。 首先,我们需要在Xcode项目中引入FMDB库。可以通过CocoaPods或者Carthage进行集成,也可以直接将源代码文件添加到项目中。如果你选择...
FMDB是一个Objective-C的SQLite数据库管理库,它使得在iOS中使用SQLite数据库变得简单易行。本教程将详细介绍如何创建一个基于FMDB的自定义单例类来实现数据库操作,以提高代码复用性和简化数据库访问。 ### 一、...
本教程将深入探讨如何利用FMDB数据库操作框架结合Objective-C的runtime机制来高效地管理和操作数据库。标题中的"iOS数据存储 FMDB + runtime"指的是使用FMDB进行数据库交互,并结合runtime来实现更灵活的功能。 **...
"ios-FMDB持久化存储_Swift.zip" 文件包是一个关于如何使用Swift实现iOS应用数据持久化的教程,特别强调了使用FMDB库进行SQLite数据库操作。FMDB是Objective-C编写的SQLite封装库,但因其良好的Swift兼容性,也被...
FMDB是iOS开发中常用的一款SQLite数据库管理库,它是一个Objective-C封装的SQLite库,使得在iOS应用中操作SQLite数据库变得更加简单。在这个"FMDB操作demo"中,开发者通过实践展示了如何利用FMDB进行基本的数据库...
在压缩包中的文件 "Simple Sqlite Database Interaction Using FMDB.doc" 很可能是文档教程,详细解释了如何使用FMDB进行SQLite数据库的简单交互,包括创建数据库、定义表结构、执行SQL查询、事务处理等步骤。...
一种常见的数据持久化方法是使用SQLite数据库,而FMDB是一个Objective-C的SQLite库,它为iOS开发者提供了简单易用的接口来操作SQLite数据库。本教程将详细介绍如何在iOS应用中使用FMDB来实现数据的读取、修改和删除...
本教程将详细介绍如何使用FMDB进行基本的数据库操作。 1. **FMDB简介** FMDB是由GitHub上的`/ccgus/fmdb`项目提供的,它是SQLite的一个轻量级封装,具有良好的性能和易用性。FMDB支持事务处理、查询、更新、插入和...
总的来说,FMDB为Objective-C开发者提供了一个强大且易于使用的SQLite接口,使得在Xcode项目中管理SQLite数据库变得更加简单。通过以上介绍,你应该能够了解如何在Xcode 6.2中使用FMDB来执行基本的SQLite操作。结合`...
这个压缩包文件"ios-FMDB.zip"包含了一个关于FMDB基本使用的教程或示例,我们可以从中学习到如何在iOS应用中集成和使用FMDB。 1. **FMDB介绍** - FMDB是基于SQLite的Objective-C封装,提供了更符合Objective-C编程...
本教程将详细讲解如何利用FMDB进行数据库操作,并实现UITableView的cell点击改变颜色的功能,以此来实现数据持久化。 首先,我们需要引入FMDB库。可以通过CocoaPods或手动下载FMDB源码并将其添加到项目中。如果使用...
FMDB是SQLite的一个Objective-C封装框架,它为数据库操作提供了一系列对象方法和类方法,使得操作数据库变得更加简单。通过FMDB,开发者可以手动导入框架,打开和关闭数据库,执行SQL语句,并处理更新结果。此外,...
FMDB是iOS平台上广泛使用的SQLite数据库的Objective-C封装库,它提供了简单易用的API来执行SQL语句,进行数据库的读写操作。而runtime则是Objective-C的一个核心特性,它允许在运行时动态地修改类的行为和属性,这在...
它提供了一个简单、灵活的解决方案,用于使用 SQLite 和 FMDB 将版本化模式管理引入新的或现有的 Cocoa 应用程序以实现持久性。 特征 支持在主机数据库中创建和管理专用迁移表。 使用 SQLite 事务安全地应用迁移。...
本教程将通过具体的案例,详细介绍如何在iOS应用中使用SQLite进行数据存储。 首先,我们需要了解SQLite的基本概念。SQLite数据库以文件形式存在,每个数据库文件就是一个SQLite数据库。表是数据库中的主要结构,...
例如,创建表、插入数据、查询数据、更新和删除记录等操作都可以通过FMDB的简单API实现。 MySQL则是一个功能强大的、开源的关系型数据库管理系统,常用于服务器端。它的安装配置过程包括下载安装包、设置环境变量、...
在iOS开发中,FMDB是一个常用的SQLite封装库,它提供了简单易用的Objective-C接口。通过FMDB,你可以创建数据库、打开连接、执行SQL语句,并处理查询结果。例如,使用FMDB创建表、插入数据、查询数据等操作可以更加...
在iOS开发中,还可以使用FMDB这样的第三方库,它提供了一个Objective-C的SQLite封装,使得数据库操作更加简单易用。FMDB提供了与SQL语句类似的接口,如`FMDatabaseQueue`用于异步操作,`FMResultSet`用于处理查询...
本教程将深入探讨如何在iOS项目中简单应用SQLite3,包括数据的保存、查询、插入和更新。 首先,你需要在Xcode项目中导入SQLite3框架。这可以通过在项目设置的“Link Binary With Libraries”部分添加`libsqlite3....
本教程将详述如何使用SQLite来实现一个简单的记事本应用,包括记事本的添加、删除和查询功能。 首先,我们需要了解SQLite的基本概念。SQLite是一个嵌入式数据库,它不需要单独的服务器进程,并且所有的数据库都存储...