`
dcj3sjt126com
  • 浏览: 1881687 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在iOS开发中使用FMDB

    博客分类:
  • IOS
阅读更多

前言

http://blog.devtang.com/blog/2012/04/22/use-fmdb/

 

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在使用上相当方便。以下是一个简单的例子:

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到你的工程中:

FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMDatabasePool.h
FMDatabasePool.m
FMDatabaseQueue.h
FMDatabaseQueue.m
FMResultSet.h
FMResultSet.m

 

建立数据库

建立数据库只需要如下一行即可,当该文件不存在时,fmdb会自己创建一个。如果你传入的参数是空串:@”” ,则fmdb会在临时文件目录下创建这个数据库,如果你传入的参数是 NULL,则它会建立一个在内存中的数据库。

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

 

打开数据库

使用如下语句,如果打开失败,可能是权限不足或者资源不足。通常打开完操作操作后,需要调用close方法来关闭数据库。

if (![db open]) {
    // error 
    return;
}
// some operation
// ...

[db close];

 

执行更新操作

除了Select操作之外,其它的都是更新操作。更新操作使用如下方法,如果有错误,可以用error参数中获得。

-[FMDatabase executeUpdate:error:withArgumentsInArray:orVAList:]

 

执行查询操作

查询操作示例如下。注意:即使操作结果只有一行,也需要先调用FMResultSet的next方法。

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提供如下多个方法来获取不同类型的数据:

intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:

 通常情况下,你并不需要关闭FMResultSet,因为相关的数据库关闭时,FMResultSet也会被自动关闭。

数据参数

通常情况下,你可以按照标准的SQL语句,用?表示执行语句的参数,如:

INSERT INTO myTable VALUES (?, ?, ?)

 然后,可以我们可以调用executeUpdate方法来将?所指代的具体参数传入,通常是用变长参数来传递进去的,如下:

NSString *sql = @"insert into User (name, password) values (?, ?)";
[db executeUpdate:sql, user.name, user.password];

 这里需要注意的是,参数必须是NSObject的子类,所以象int,double,bool这种基本类型,需要封装成对应的包装类才行,如下所示:

// 错误,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的管理。

// 创建,最好放在一个单例的类中
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

 

  • 大小: 36.3 KB
分享到:
评论

相关推荐

    iOS开发中使用FMDB来使程序连接SQLite数据库

    以下是关于FMDB在iOS开发中使用SQLite数据库的详细说明: 1. **什么是FMDB** FMDB是由CocoaChina社区成员ccgus开发的一个Objective-C框架,它基于SQLite的C语言API进行了封装。FMDB提供了简单易用的类和方法,让...

    iOS开发中的FMDB数据库操作

    本篇文章将深入探讨FMDB在iOS开发中的应用,特别是如何在收藏页面等场景下进行数据库操作。 首先,让我们了解FMDB的核心概念。FMDB基于SQLite,一个轻量级、事务性的关系型数据库,广泛应用于移动设备。FMDB提供了...

    ios 数据库 (FMDB使用)

    以上就是关于 "ios 数据库 (FMDB使用)" 的详细讲解,通过这个 demo,你可以了解到如何在 iOS 应用中利用 FMDB 实现数据库的完整操作流程,并且掌握单例模式的应用,以便在实际项目中高效地管理和操作数据库。在实践...

    FMDB在IOS开发中的使用

    SQLite是一款轻量级的、嵌入式的、关系型数据库,适用于移动设备和小型应用程序,FMDB的出现使得在iOS应用中使用SQLite变得更加便捷。 **一、FMDB的基本概念** 1. **FMDatabase**: FMDatabase是FMDB的核心类,代表...

    iOS开发--fmdb数据库

    本篇文章将深入探讨如何在iOS项目中使用FMDB进行数据库操作,包括数据的增、删、查、改等基本功能。 首先,我们需要了解FMDB的基本结构。FMDB库主要包括三个主要类:`FMDatabase`、`FMStatement`和`FMResultSet`。`...

    ios-FMDB简单使用.zip

    在这个“ios-FMDB简单使用.zip”压缩包中,我们很可能会找到一个名为“operationDB”的示例项目,它展示了如何在iOS应用中使用FMDB进行基本的增删改查(CRUD)操作。 1. **安装FMDB** 要在iOS项目中使用FMDB,你...

    iOS开发--FMDB操作

    在iOS开发中,数据库操作是不可或缺的一部分,尤其是在处理本地数据存储时。FMDB是一个非常流行的Objective-C库,它是SQLite数据库的轻量级封装,提供了简单易用的接口来进行数据库的各种操作,如添加、删除、查询和...

    ios-关于FMDB在Swift工程中使用的一个示例.zip

    在iOS开发中,数据持久化是一项关键任务,它允许应用程序保存和恢复数据,即使应用关闭或设备重启。这里我们关注的是FMDB,一个流行且强大的SQLite数据库管理库,被广泛用于Objective-C和Swift项目中。这个"ios-关于...

    ios-练习一下FMDB查询操作.zip

    在iOS开发中,数据库的使用是必不可少的一部分,特别是在需要存储用户数据或实现本地化功能时。本案例中,我们关注的是“ios-练习一下FMDB查询操作.zip”,它是一个使用FMDB库进行本地数据库操作的实践项目,主要...

    ios sqlite封装FMDB

    在iOS开发中,SQLite是一个广泛使用的轻量级关系型数据库,它允许开发者在应用程序中存储、管理和检索数据。而FMDB是Objective-C的一个SQLite库,它为iOS开发者提供了一个易于使用的接口来操作SQLite数据库,极大地...

    ios-归档和fmdb相结合的一个demo.zip

    在iOS开发中,数据持久化是至关重要的,它能让应用在关闭或重新启动后依然能够保存和恢复数据。本示例“ios-归档和fmdb相结合的一个demo”结合了两种常见的iOS数据持久化方法:对象归档和SQLite数据库(通过FMDB库)...

    使用FMDB写的demo

    在iOS开发中,FMDB提供了Objective-C接口,使得与SQLite交互变得简单易行。 **FMDB的核心功能** 1. **创建和打开数据库**:FMDB提供了`FMDatabase`类来创建、打开或关闭SQLite数据库。你可以通过`-[FMDatabase ...

    ios-数据库操作FMDB和WCDB.zip

    在iOS开发中,数据持久化是一项重要的任务,用于在应用关闭后保留数据并能在下次启动时继续使用。这里我们关注的是两种广泛使用的SQLite数据库管理库:FMDB和WCDB。这两个库都为Objective-C和Swift开发者提供了简洁...

    iosFMDB开发的通讯录

    综上所述,"iosFMDB开发的通讯录"项目展示了如何在iOS应用中利用FMDB与SQLite数据库进行交互,实现一个功能完善的通讯录应用,包括数据存储、查询、删除以及用户界面的设计。这不仅锻炼了开发者对FMDB的掌握,也体现...

    iOS 开发 fmdb

    接下来,我们将深入探讨FMDB库以及如何在iOS开发中使用它。 首先,FMDB的核心功能是提供一个Objective-C的接口来与SQLite进行交互。SQLite是一个轻量级的关系型数据库,它不需要单独的服务器进程,并且支持多种操作...

    ios FMDB用户登录界面

    在iOS应用开发中,为了存储用户数据或者实现用户登录功能,开发者常常会使用数据库,而FMDB是Objective-C对SQLite数据库的一个流行封装库。本文将深入探讨如何利用FMDB在iOS上构建用户登录界面。 首先,FMDB是...

    IOS 第三方FMDB包

    在iOS应用开发中,数据管理是不可或缺的一部分,尤其是在需要进行本地数据持久化存储时。FMDB就是一款优秀的第三方数据库管理库,它为iOS应用程序提供了SQLite数据库的简单Objective-C封装,使得开发者能够方便、...

    ios-Swift中调用FMDB.zip

    在iOS开发中,数据持久化是必不可少的一部分,它能让应用在关闭或重启后依然能保留数据。本主题聚焦于在Swift 3.0环境中如何利用FMDB库进行SQLite数据库操作。FMDB是一个Objective-C编写的SQLite数据库管理工具,但...

    使用fmdb的一个ios demo

    总结,`FMDB`是iOS开发中使用SQLite的重要工具,其简洁的API和强大的功能使其成为首选。通过研究`SmartFMDB`这个示例,你将能够更好地掌握`FMDB`的使用,为你的iOS应用提供稳定高效的数据存储解决方案。在实际开发中...

Global site tag (gtag.js) - Google Analytics