前言:
今天,就让我们,重点学习一下FMDB。
FMDB学习
一、基本介绍
- 简介:-由于iOS中原生的 SQLite API 使用时非常不方便 ,于是就出现了一系列将 SQLite API 进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB是一款简洁易用、轻量级的封装库。
- 什么是FMDB
-- FMDB是iOS平台的SQLite数据库框架
-- FMDB以OC的方式封装了SQLite的C语言API -
在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包。
- FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。
- FMDB常用类:
-- FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库用来执行SQL语句
-- FMResultSet:使用FMDatabase执行查询后的结果集
-- FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的 - FMDB的优点
-- 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
-- 对比苹果自带的Core Data框架,更加轻量级和灵活
-- 提供了多线程安全的数据库操作方法,有效地防止数据混乱 - FMDB的缺点
-- 它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以
只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本
和维护的成本,就需要使用比较原始的SQLite。
二、使用方法
- 打开数据库
通过指定SQLite数据库文件路径来创建FMDatabase对象
FMDatabase *db = [FMDatabase databaseWithPath:path];
if (![db open]) {NSLog(@"数据库打开失败!");}
关于文件路径的三种情况:
--1.具体的文件路径,或是数据库的文件不存在时,fmdb会自己创建一个。
--2.若文件路径为空字符串@"",会在临时目录创建一个空的数据库。
并且,当(FMDatabase)数据库断开连接时,数据库文件被删除。
--3.若你传入的参数为NULL,则它会建立一个在内存中的数据库,数据库断开连接时,数据库文件被删除。 - 执行更新:
- 在FMDB中,除查询以外的所有操作,都称为“更新”如:create、drop、insert、update、delete等。
- FMDB数据库操作使用 executeUpdate: 方法执行更新,返回BOOL型。
- ** executeUpdate:用法
- (BOOL)executeUpdate:(NSString)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
示例
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"] - 执行查询
- ** 查询方法
查询方法
- (FMResultSet )executeQuery: (NSString)sql, ...
- (FMResultSet )executeQueryWithFormat:(NSString)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
示例
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍历结果集
while ([rs next]) { NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];}
*FMDatabaseQueue
- 注意:
- FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个
FMDatabase实例,会造成数据混乱等问题
- 为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue
- FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; - 简单使用
简单使用
[queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
while ([rs next]) {
// …
}
}]; - 使用事务
使用事务
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
while ([rs next]) {
// …
}
}];
三、示例代码
//
// ViewController.m
// FMDB
//
// Created by mac on 16/7/3.
// Copyright © 2016年 mac. All rights reserved.
//
#import "ViewController.h"
#import "FMDB.h"
@interface ViewController ()
@property(strong,nonatomic)FMDatabase *db;
@end
@implementation ViewController
#pragma mark- 创建数据库
- (void)viewDidLoad {
[super viewDidLoad];
// 1.获取数据库文件的路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"];
// 2.获取数据库
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
// 3.打开数据库
if([db open]){
//4.创表
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
if (result) {
NSLog(@"创表成功");
}else{
NSLog(@"创表失败");
}
}
self.db = db;
}
#pragma mark- 触发执行
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self delete];
[self insert];
[self query]
}
#pragma mark- 插入数据
- (void)insert
{
for (int i = 0; i<10; i++) {
NSString *name = [NSString stringWithFormat:@"jack-%d",arc4random_uniform(100)];
// executeUpdate: 不确定的参数用?来占位
[self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name, @(arc4random_uniform(40))];
// [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]];
// executeUpdateWithFormat : 不确定的参数用%@、%d等来占位
// [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)];
}
}
#pragma mark- 删除数据
-(void)delete{
// [self.db executeUpdate:@"DELETE FROM t_student;"];
[self.db executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
[self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
}
#pragma mark- 查询数据
- (void)query
{
// 1.执行查询语句
FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_student"];
// 2.遍历结果
while ([resultSet next]) {
int ID = [resultSet intForColumn:@"id"];
NSString *name = [resultSet stringForColumn:@"name"];
int age = [resultSet intForColumn:@"age"];
NSLog(@"%d %@ %d", ID, name, age);
}
}
@end
- 提示:
如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是
从0开始,而是接着之前的ID进行编号。 - 注意:
不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。
学习网站:
1.FMDB使用小结
http://blog.sina.com.cn/s/blog_1410870560102wyjo.html
2.[数据库操作(使用FMDB)]
(http://blog.csdn.net/xyz_lmn/article/details/9312837)
3.FMDB使用
(http://www.cnblogs.com/wuhenke/archive/2012/02/07/2341656.html)http://www.cnblogs.com/wuhenke/archive/2012/02/07/2341656.html