@(〓〓 iOS-实用技术)[SQLite 数据库]
- 作者: Liwx
- 邮箱: [email protected]
目录
- 09.iOS FMDB的基本使用
- 1.FMDB基本使用
- FMDB简介
- FMDB的安装方式
- FMDB核心类
- FMDatabase数据库
- FMResultSet查询结果集
- FMDatabaseQueue线程安全数据库操作
- FMDB使用步骤
- 2.FMDabaseQueue的简单使用
- FMDabaseQueue简介
- FMDabaseQueue的使用
- 3.FMDB FMDatabase类的简单使用
- 手动集成FMDB步骤
- 创建数据库和数据表基本步骤
- FMDatabase数据库的增删改查(CRUD)
- 4.FMDatabaseQueue数据库队列基本使用
- 使用FMDatabaseQueue创建数据库
- FMDatabaseQueue队列数据库的增删改查(CRUD)
1.FMDB基本使用
FMDB简介
- 1.什么是FMDB?
FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API
- 2.FMDB有什么优势?
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
提供了多线程安全的数据库操作方法,有效地防止数据混乱
FMDB的安装方式
- 1.Cocoapods
pod 'FMDB'
- 2.手动集成
- 1.下载FMDB框架
FMDB GitHub链接: https://github.com/ccgus/fmdb
- 1.下载FMDB框架
1.导入FMDB文件
2.导入系统依赖库sqlite3.0.tbd
FMDB核心类
FMDatabase数据库
一个FMDatabase对象就代表一个单独的
SQLite数据库
用来执行SQL语句
FMResultSet查询结果集
使用FMDatabase执行查询后的
结果集
FMDatabaseQueue线程安全数据库操作
用于在多线程中执行多个查询或更新,它是
线程安全
的
FMDB使用步骤
-
1.打开数据库
通过指定SQLite数据库文件路径来创建FMDatabase对象具体文件路径
如果不存在会自动创建.
空字符串@""
会在临时目录创建一个空的数据库当FMDatabase连接关闭时,数据库文件也被删除
nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
// 1.打开数据库
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) { NSLog(@"打开成功!"); }
- 2.执行更新
在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete
等
使用executeUpdate:方法执行更新
// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString)format, ...
-(BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
- 执行更新示例:
// 2.执行更新
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
- 3.执行查询
- 查询方法
- (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"];
}
- 4.关闭数据库
[self.db close];
2.FMDabaseQueue的简单使用
FMDabaseQueue简介
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
FMDabaseQueue的使用
- 1.FMDatabaseQueue的使用
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
// 查询
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
使用事务
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
//查询
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
3.FMDB FMDatabase类的简单使用
手动集成FMDB步骤
- 1.下载FMDB框架
FMDB GitHub链接: https://github.com/ccgus/fmdb
- 2.将fmdb框架文件夹拖入工程
- 3.添加系统依赖库
sqlite3.0.tbd
- 4.导入
FMDB.h
头文件,编译成功.集成FMDB完成
创建数据库和数据表基本步骤
- 1.拼接数据库存储的沙盒路径
- 2.通过路径创建数据库
- 3.打开数据库
- 如果成功打开数据库后,创建数据表.
- 创建数据库和数据表参考代码
- (void)viewDidLoad {
[super viewDidLoad];
// 0.拼接数据库存放的沙盒路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.通过路径创建数据库
self.db = [FMDatabase databaseWithPath:sqlFilePath];
// 2.打开数据库
if ([self.db open]) {
NSLog(@"打开成功");
BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER DEFAULT 1)"];
if (success) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
} else {
NSLog(@"打开失败");
}
}
FMDatabase数据库的增删改查(CRUD
)
- 1.插入数据
// 插入数据
static NSInteger age = 10;
age++;
BOOL success = [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
- 2.删除数据
// 删除数据
BOOL success = [self.db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
- 3.修改数据
// 修改数据
BOOL success = [self.db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
- 4.查询数据
// 查询数据
FMResultSet *result = [self.db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
while ([result next]) {
int ID = [result intForColumnIndex:0];
NSString *name = [result stringForColumnIndex:1];
int age = [result intForColumn:@"age"];
NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}
4.FMDatabaseQueue数据库队列基本使用
使用FMDatabaseQueue类在多线程中执行多个查询或更新是
线程安全
的.
使用FMDatabaseQueue创建数据库
- 1.创建一个FMDatabaseQueue对象
只要成功创建数据库队列对象,FMDB内部就会自动给我们加载数据库对象.无需再执行打开数据库操作.
- 2.使用block传递数据库
使用
inDatabase:
方法传递数据库对象.
- 3.使用SQL语句创建数据表
- (void)viewDidLoad {
[super viewDidLoad];
// 0.拼接数据库存放的沙盒路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.创建一个FMDatabaseQueue对象
// 只要创建数据库队列对象, FMDB内部就会自动给我们加载数据库对象
self.dbQueue = [FMDatabaseQueue databaseQueueWithPath:sqlFilePath];
// 2.执行操作
// 会通过block传递队列中创建好的数据库
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);"];
if (success) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
}];
}
FMDatabaseQueue队列数据库的增删改查(CRUD
)
- 1.插入数据
- (IBAction)insertClick {
static NSInteger age = 10;
age++;
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
}];
}
- 2.删除数据
// 删除数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
// 判断是否SQL是否执行成功
// ...
}
- 3.修改数据
// 修改数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
// 判断是否SQL是否执行成功
// ...
}
- 4.查询数据
// 查询数据
- (IBAction)queryClick {
[self.dbQueue inDatabase:^(FMDatabase *db) {
FMResultSet *result = [db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
while ([result next]) {
int ID = [result intForColumnIndex:0];
NSString *name = [result stringForColumnIndex:1];
int age = [result intForColumn:@"age"];
NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}
}];
}