FMDB的简单使用
1、什么是FMDB?
- FMDB是iOS平台的SQLite数据库框架
- FMDB以OC的方式封装了SQLite的C语言API。
- 无论项目中使用 ARC 还是 MRC,对 FMDB 都没有任何影响,FMDB 会在编译项目时自动匹配。
2、FMDB主要的类。
- - (BOOL)executeUpdate:(NSString*)sql, ...;
- - (BOOL)executeUpdateWithFormat:(NSString*)format, ...;
- - (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
执行更新语句后会返回一个 BOOL 值,返回YES表示执行更新语句成功,返回NO表示出现错误,可以通过调用 -lastErrorMessage 和 -lastErrorCode 方法获取更多错误信息。
创库创表:
// 获取数据库文件路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"];
// 创建数据库
FMDatabase *db = [FMDatabase databaseWithPath:path];
self.db = db;
if (db.open) {// 打开数据库,数据库必须是打开状态,才能与之交互。如果没有足够的资源和权限来打开或者创建数据库,数据库会打开失败。
NSLog(@"打开成功");
// 创表
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL)"];
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败:%@", [self.db lastErrorMessage]);
}
} else {
NSLog(@"打开失败");
}
添加数据:
// executeUpdate:不确定的参数用?来占位,所有参数都必须是对象。
// BOOL result = [self.db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?)", @"jick", @(arc4random_uniform(20))];
// executeUpdateWithFormat:不确定的参数用%@、%f、%d、%u等来占位。
BOOL result = [self.db executeUpdateWithFormat:@"INSERT INTO t_person (name, age) VALUES (%@, %d)", @"jick", arc4random_uniform()];
if (result) {
NSLog(@"添加成功");
} else {
NSLog(@"添加失败:%@", [self.db lastErrorMessage]);
}
删除、更新数据:同创表、添加数据方法相同,只需修改SQL语句就行了。
- 关闭数据库: [self.db close];
文件路径有三种情况:
- 具体文件路径:如果不存在会自动创建。
- 空字符串@"":会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被销毁。
- nil:会在内存中创建一个临时数据库,当FMDatabase连接关闭时,数据库会被销毁。
2.2、FMResultSet。
- - (FMResultSet *)executeQuery:(NSString*)sql, ...;
- - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...;
- - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;
// 执行查询语句
FMResultSet *result = [self.db executeQuery:@"SELECT * FROM t_person WHERE age < 15"];
// 遍历结果,它是基于列的位置来查询数据。
while (result.next) {
int ID = [result intForColumn:@"id"];
NSString *name = [result stringForColumn:@"name"];
int age = [result intForColumn:@"age"];
NSLog(@"id = %d, name = %@, age = %d", ID, name, age);
}
- 关闭数据库: [self.db close];
- FMDatabaseQueue的创建:
数据库文件路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"];
// 创建数据库
FMDatabaseQueue *dbq = [FMDatabaseQueue databaseQueueWithPath:path];
self.dbq = dbq;
// 打开数据库
[dbq inDatabase:^(FMDatabase *db) {
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL)"]; // 创表
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败:%@", [db lastErrorMessage]);
}
}];
- 添加数据:更新、删除和添加数据的方法类似。
[self.dbq inDatabase:^(FMDatabase *db) {
BOOL result = [db executeUpdateWithFormat:@"INSERT INTO t_person (name, age) VALUES (%@, %d)", @"jick", arc4random_uniform()];
if (result) {
NSLog(@"添加成功");
} else {
NSLog(@"添加失败");
}
}];
- 查询数据:
[self.dbq inDatabase:^(FMDatabase *db) {
// 执行查询语句
FMResultSet *result = [db executeQuery:@"SELECT * FROM t_person WHERE age < 15"];
// 遍历结果
while (result.next) {
int ID = [result intForColumn:@"id"];
NSString *name = [result stringForColumn:@"name"];
int age = [result intForColumn:@"age"];
NSLog(@"id = %d, name = %@, age = %d", ID, name, age);
}
}]; - 关闭数据库: [self.dbq close];
3、FMDB的多语句、多事务处理。
3.1、多语句的批处理。
通过-executeStatements:withResultBlock:方法在一个字符串中执行多语句:
- 创建多张表并添加数据:
NSString *sql = [NSString stringWithFormat:
@"CREATE TABLE IF NOT EXISTS t_person1 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"
"CREATE TABLE IF NOT EXISTS t_person2 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"
"CREATE TABLE IF NOT EXISTS t_person3 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"
"INSERT INTO t_person1 (name, age) VALUES (%@, %d);"
"INSERT INTO t_person1 (name, age) VALUES (%@, %d);"
"INSERT INTO t_person2 (name, age) VALUES (%@, %d);"
"INSERT INTO t_person2 (name, age) VALUES (%@, %d);"
"INSERT INTO t_person3 (name, age) VALUES (%@, %d);"
"INSERT INTO t_person3 (name, age) VALUES (%@, %d);",
@"'jick'", , @"'tom'", , @"'rose'", , @"'jim'", , @"'hank'", , @"'jone'", ];
BOOL result = [self.db executeStatements:sql];
if (result) {
NSLog(@"创表并添加数据成功");
} else {
NSLog(@"创表或添加数据失败:%@", [self.db lastErrorMessage]);
}- 查询多张表的多个字段值:
NSString *sql = @"SELECT * FROM t_person1 WHERE age < 30;"
"SELECT * FROM t_person2 WHERE age < 30;"
"SELECT * FROM t_person3 WHERE age < 30;";
[self.db executeStatements:sql withResultBlock:^int(NSDictionary *resultsDictionary) {
int ID = [resultsDictionary[@"id"] intValue];
NSString *name = resultsDictionary[@"name"];
int age = [resultsDictionary[@"age"] intValue];
NSLog(@"name = %@, id = %d, age = %d", name, ID, age);
return ;
}];
3.2、FMDataba事务处理。
在FMDatabase/FMDatabaseQueue中通过begin/commit语句来开始和提交事务。
// [self.db executeUpdate:@"begin exclusive transaction"]; // 用SQL语句的方式开启事务
[self.db beginTransaction]; // 开启事务
[self.db executeUpdateWithFormat:@"INSERT INTO t_person1 (name, age) VALUES (%@, %d);",@"'jick1'", ];
[self.db executeUpdateWithFormat:@"INSERT INTO t_person2 (name, age) VALUES (%@, %d);",@"'jick1'", ];
// [self.db executeUpdate:@"rollback transaction"]; // 用SQL语句的方式中途回滚
// [self.db rollback]; // 中途回滚。
[self.db executeUpdateWithFormat:@"INSERT INTO t_person3 (name, age) VALUES (%@, %d);",@"'jick1'", ];
// [self.db executeUpdate:@"commit transaction"]; // 用SQL语句的方式提交事务
[self.db commit]; // 提交事务
在FMDatabaseQueue中通过调用方法来提交事务。
[self.dbq inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdateWithFormat:@"INSERT INTO t_person1 (name, age) VALUES (%@, %d);",@"'jick1'", ];
[db executeUpdateWithFormat:@"INSERT INTO t_person2 (name, age) VALUES (%@, %d);",@"'jick1'", ];
// *rollback = YES; // 中途回滚
[db executeUpdateWithFormat:@"INSERT INTO t_person3 (name, age) VALUES (%@, %d);",@"'jick1'", ];
}];
4、在Swift中使用FMDB。
- 将 FMDB 的 .m 和 .h 全部文件拖进你的项目。
- 如果 Xcode 提示创建桥接文件,需要点击创建。如果没有提示,且项目中也没有桥接文件,需要手动添加。
- 在桥接文件中,添加这行代码:#import "FMDB.h"
- 可以从 "src/extra/Swift Extension" 文件夹中拷贝 FMDatabaseVariadic.swift 文件到项目中,就可以使用 executeUpdate 和 executeQuery 多参数了。
FMDB的简单使用的更多相关文章
- iOS 数据库第三方FMDB的简单使用
一 FMDB的简单说明及介绍 FMDB的github地址 https://github.com/ccgus/fmdb FMDB是一款简洁的,易用的封装库,简单介绍一下FMDB的使用 在FMDB下载文件 ...
- FMDB的简单实用
一.FMDB 的框架引入点击此处去GitHub下载 二.FMDB 的优缺点 优点:使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了 ...
- 第三方FMDB的简单使用
1,导入第三方头文件 #import "FMDB.h" //定义全局变量 @implementation InputInformationViewController { UITe ...
- FMDB的简单用法
使用cocoaPods将FMDB下载到工程 第一步:引入框架,引入支持类库(libsqlite3.0.tbd) #import <FMDB.h> 声明属性 @interface ViewC ...
- iOS开发——高级篇——FMDB 数据库简单使用
#import <Foundation/Foundation.h> @interface UserDB : NSObject // 把userDB设计成一个单例类 + (id)shareI ...
- FMDB最简单的教程-3 清空数据表并将自增字段清零
[db executeUpdate:@"DELETE FROM MemberInfo"]; [db executeUpdate:@"UPDATE sqlite_seque ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- iOS Sqlite3 Demo 及 FMDB Demo
本文是主要实现了三个函数: testSQLite3 是测试系统自带的sqlite3的demo testFMDB是测试FMDB存取简单的数据类型的 的demo testFMDB2是将任意对象作为一个整体 ...
- 数据存储之第三方FMDB
上周四.周五在忙公司的事情和炒股,没来得及更新博客,这周就补一下,学习总结下FMDB. FMDB是对sqlite的封装,特别是在多线程情况下,使用sqlite是非常麻烦,而使用FMDB相对简单,下面是 ...
随机推荐
- 我的游戏蜗牛web前端面试经历
蜗牛在江苏苏州地区应该算是比较大的互联网公司了,可以称得上中国游戏的鼻祖,之前一直很想进蜗牛,但作为一个应届毕业生却没有看到蜗牛发布任何关于招聘实习生的职位,无奈之下于是就毛遂自荐了,主动以邮件的形式 ...
- Python生成二维码脚本
简单的记录下二维码生成和解析的Python代码 依赖下面三个包: PIL(图像处理包,安装:pip install PIL) qrcode(二维码生成包,安装:pip install qrcode) ...
- Oracle创建用户、表空间并设置权限
代码: //dba账户登录 sqlplus 请输入用户名:dpp_data as sysdba 请输入口令:dpp_data //创建账号 create user techrpt_data ident ...
- 启用数据库的 Service Broker
--is_broker_enabled为0未启用,为1启用SELECT name,is_broker_enabled FROM sys.databases WHERE name = 'DBNAME' ...
- C++11学习笔记
C++11 1.long long新类型 2.列表初始化 int t=0; int t={0}; int t(0); int t{0}; 注意:如果我们使用列表初始化有丢失信息的风险,则编译器报错 l ...
- How to return dictionary keys as a list in Python 3.3
http://btmiller.com/2015/04/13/get-list-of-keys-from-dictionary-in-python-2-and-3.html Get a List of ...
- Android中自定义ProgressBar
<ProgressBar android:id="@+id/more_vprogress_more" android:layo ...
- 使用exe4j打包Java程序
工具: exe4j软件(云盘存) 可以运行的Java程序的jar包 打开我们已经安装好的exe4j软件,首先看到的是一个欢迎界面,我们直接[next]就可以了: 2 在第二步中我们选择[JAR in ...
- springmvc restful配置有一个小小的坑坑
首先web.xml配置 <!-- spring-mvc --> <servlet> <servlet-name>springServlet</servlet- ...
- 容器--LinkedList
一.前言 上一篇我们介绍了List的重要实现之一ArrayList, 在大多数情况下,我们写代码时会直接使用到ArrayList,因为其在随机访问的优势是其它List无法比拟的.除了ArrayLis ...