iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB
(https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单介绍下FMDB的使用。

在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包。

FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。

FMDB常用类:

FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。

FMResultSet :执行查询一个FMDatabase结果集,这个和android的Cursor类似。

FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类。

创建数据库:

  1. db = [FMDatabase databaseWithPath:database_path];

1、当数据库文件不存在时,fmdb会自己创建一个。

2、 如果你传入的参数是空串:@"" ,则fmdb会在临时文件目录下创建这个数据库,数据库断开连接时,数据库文件被删除。

3、如果你传入的参数是 NULL,则它会建立一个在内存中的数据库,数据库断开连接时,数据库文件被删除。

打开数据库:

  1. [db open]

返回BOOL型。

关闭数据库:

  1. [db close]

数据库增删改等操作:

除了查询操作,FMDB数据库操作都执行executeUpdate方法,这个方法返回BOOL型。

看一下例子:

创建表:

  1. if ([db open]) {
  2. NSString *sqlCreateTable =  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];
  3. BOOL res = [db executeUpdate:sqlCreateTable];
  4. if (!res) {
  5. NSLog(@"error when creating db table");
  6. } else {
  7. NSLog(@"success to creating db table");
  8. }
  9. [db close];
  10. }

添加数据:

  1. if ([db open]) {
  2. NSString *insertSql1= [NSString stringWithFormat:
  3. @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
  4. TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];
  5. BOOL res = [db executeUpdate:insertSql1];
  6. NSString *insertSql2 = [NSString stringWithFormat:
  7. @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
  8. TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];
  9. BOOL res2 = [db executeUpdate:insertSql2];
  10. if (!res) {
  11. NSLog(@"error when insert db table");
  12. } else {
  13. NSLog(@"success to insert db table");
  14. }
  15. [db close];
  16. }

修改数据:

  1. if ([db open]) {
  2. NSString *updateSql = [NSString stringWithFormat:
  3. @"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",
  4. TABLENAME,   AGE,  @"15" ,AGE,  @"13"];
  5. BOOL res = [db executeUpdate:updateSql];
  6. if (!res) {
  7. NSLog(@"error when update db table");
  8. } else {
  9. NSLog(@"success to update db table");
  10. }
  11. [db close];
  12. }

删除数据:

  1. if ([db open]) {
  2. NSString *deleteSql = [NSString stringWithFormat:
  3. @"delete from %@ where %@ = '%@'",
  4. TABLENAME, NAME, @"张三"];
  5. BOOL res = [db executeUpdate:deleteSql];
  6. if (!res) {
  7. NSLog(@"error when delete db table");
  8. } else {
  9. NSLog(@"success to delete db table");
  10. }
  11. [db close];
  12. }

数据库查询操作:

查询操作使用了executeQuery,并涉及到FMResultSet。

  1. if ([db open]) {
  2. NSString * sql = [NSString stringWithFormat:
  3. @"SELECT * FROM %@",TABLENAME];
  4. FMResultSet * rs = [db executeQuery:sql];
  5. while ([rs next]) {
  6. int Id = [rs intForColumn:ID];
  7. NSString * name = [rs stringForColumn:NAME];
  8. NSString * age = [rs stringForColumn:AGE];
  9. NSString * address = [rs stringForColumn:ADDRESS];
  10. NSLog(@"id = %d, name = %@, age = %@  address = %@", Id, name, age, address);
  11. }
  12. [db close];
  13. }

FMDB的FMResultSet提供了多个方法来获取不同类型的数据:

数据库多线程操作:

如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。
在闭包中操作数据库,而不直接参与FMDatabase的管理。

  1. FMDatabaseQueue * queue = [FMDatabaseQueue databaseQueueWithPath:database_path];
  2. dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);
  3. dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);
  4. dispatch_async(q1, ^{
  5. for (int i = 0; i < 50; ++i) {
  6. [queue inDatabase:^(FMDatabase *db2) {
  7. NSString *insertSql1= [NSString stringWithFormat:
  8. @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",
  9. TABLENAME, NAME, AGE, ADDRESS];
  10. NSString * name = [NSString stringWithFormat:@"jack %d", i];
  11. NSString * age = [NSString stringWithFormat:@"%d", 10+i];
  12. BOOL res = [db2 executeUpdate:insertSql1, name, age,@"济南"];
  13. if (!res) {
  14. NSLog(@"error to inster data: %@", name);
  15. } else {
  16. NSLog(@"succ to inster data: %@", name);
  17. }
  18. }];
  19. }
  20. });
  21. dispatch_async(q2, ^{
  22. for (int i = 0; i < 50; ++i) {
  23. [queue inDatabase:^(FMDatabase *db2) {
  24. NSString *insertSql2= [NSString stringWithFormat:
  25. @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",
  26. TABLENAME, NAME, AGE, ADDRESS];
  27. NSString * name = [NSString stringWithFormat:@"lilei %d", i];
  28. NSString * age = [NSString stringWithFormat:@"%d", 10+i];
  29. BOOL res = [db2 executeUpdate:insertSql2, name, age,@"北京"];
  30. if (!res) {
  31. NSLog(@"error to inster data: %@", name);
  32. } else {
  33. NSLog(@"succ to inster data: %@", name);
  34. }
  35. }];
  36. }
  37. });

版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS第三方数据库--FMDB 分类: ios技术 2015-03-01 09:38 57人阅读 评论(0) 收藏的更多相关文章

  1. *** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏

    *** glibc detected *** malloc(): memory corruption: 0x09eab988 *** 发现是由于memset越界写引起的. 在Linux Server上 ...

  2. 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 17875 Accepted: ...

  3. 哈希-Gold Balanced Lineup 分类: POJ 哈希 2015-08-07 09:04 2人阅读 评论(0) 收藏

    Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13215 Accepted: 3873 ...

  4. HDU 1272 小希的迷宫(并查集) 分类: 并查集 2015-07-07 23:38 2人阅读 评论(0) 收藏

    Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...

  5. hadoop容灾能力测试 分类: A1_HADOOP 2015-03-02 09:38 291人阅读 评论(0) 收藏

    实验简单来讲就是 1. put 一个600M文件,分散3个replica x 9个block 共18个blocks到4个datanode 2. 我关掉了两个datanode,使得大部分的block只在 ...

  6. sscanf 函数 分类: POJ 2015-08-04 09:19 4人阅读 评论(0) 收藏

    sscanf 其实很强大 分类: 纯C技术 技术笔记 2010-03-05 16:00 12133人阅读 评论(4) 收藏 举报 正则表达式stringbuffercurlgoogle 最近在做日志分 ...

  7. Mahout快速入门教程 分类: B10_计算机基础 2015-03-07 16:20 508人阅读 评论(0) 收藏

    Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单 ...

  8. iOS 消息推送原理及实现总结 分类: ios技术 2015-03-01 09:22 70人阅读 评论(0) 收藏

    在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服 ...

  9. ASIHTTPRequest异步请求 分类: ios技术 2015-03-01 09:33 48人阅读 评论(0) 收藏

    我们运行程序,如果网速很慢,查询的时候会一直黑屏,直到请求结束画面才出现,这样用户体验很不好.因此同步请求一般只是在某个子线 程中使用,而不在主线程中使用.异步请求的用户体验要比同步请求好,因此一般情 ...

随机推荐

  1. angularJS Directive学习

    Directive 指令 直接上实例 index.html <!doctype html> <html ng-app="drag"> <head> ...

  2. Ubuntu下安装Reids

    安装 官网  http://redis.io/    下载安装包 redis-3.0.5.tar.gz 解压 tar -zxvf redis-3.0.5.tar.gz cd redis-3.0.5 安 ...

  3. 2016中国大学生程序设计竞赛 - 网络选拔赛 1004 Danganronpa

    Problem Description Chisa Yukizome works as a teacher in the school. She prepares many gifts, which ...

  4. 吾爱破解脱壳练习第五期------upx壳

    内存镜像法: 载入OD:

  5. Sphinx配置过程

    http://www.oschina.net/question/84274_11938 http://www.ibm.com/developerworks/library/os-php-sphinxs ...

  6. java验证控制的方法

    TestNullOrEmpty.java public class TestNullOrEmpty { public static void main(String[] args) {         ...

  7. jQuery笔记(1)

    jQuery 是一个类库 拥有众多js函数的类库 jQuery 大大简化了js的书写代码,看的舒服,用的爽. jQuery 是一个数组,它能够隐性的遍历. 比如 ${"button" ...

  8. 关于arguments.callee.caller.arguments[0]获得event的一些问题

    先从一个简单的例子说起,一个简单的button控件如下: < input  type ='button'  name ='mybtn'  id ='mybtn'  onclick ='myFun ...

  9. myeclipse连接hadoop集群编程及问题解决

    原以为搭建一个本地编程测试hadoop程序的环境很简单,没想到还是做得焦头烂额,在此分享步骤和遇到的问题,希望大家顺利. 一.要实现连接hadoop集群并能够编码的目的需要做如下准备: 1.远程had ...

  10. FZU Problem 2150 Fire Game(bfs)

    这个题真要好好说一下了,比赛的时候怎么过都过不了,压点总是出错(vis应该初始化为inf,但是我初始化成了-1....),wa了n次,后来想到完全可以避免这个问题,只要入队列的时候判断一下就行了. 由 ...