FMDB有三个主要的类
1. FMDatabase
一个FMDatabase对象就代表一个单独的SQLLite数据库
用来执行SQL语句
2.FMResultSet
使用FMDatabase执行查询后的结果集合
3.FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
文件路径有三种情况
1.具体文件路径
如果不存在会自动创建
2.空字符串@""
会在临时目录创建一个空的数据库
当FMDatabase连接关闭时,数据库文件也被删除
3.nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
创建数据库和表
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)FMDatabase * db;
- (IBAction)insertData:(id)sender;
- (IBAction)upData:(id)sender;
- (IBAction)deleteData:(id)sender;
- (IBAction)qurey:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//获取沙盒的路径
NSString * filename=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"student.db"];
//1.创建数据库实例对象
self.db =[FMDatabase databaseWithPath:filename];
//2.打开数据库
if ([self.db open]) {
NSLog(@"数据库打开成功!");
//创建数据库表
BOOL result= [self.db executeUpdate:@"create table if not exists t_student(id integer primary key autoincrement ,name text,age integer)"];
if (result) {
NSLog(@"创建表成功!");
}else{
NSLog(@"创建表失败!");
}
}else{
NSLog(@"数据库打开失败!");
}
}
插入数据
//插入数据
- (IBAction)insertData:(id)sender {
BOOL result=[self.db executeUpdate:@"insert into t_student (id ,name,age) values (?,?,?)",@3,@"胡星",@38];
if (result) {
NSLog(@"插入数据成功!");
}else{
NSLog(@"插入数失败!");
}
}
//修改数据
//修改数据
- (IBAction)upData:(id)sender {
BOOL result =[self.db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
if (result) {
NSLog(@"修改数据成功!");
}else{
NSLog(@"修改数据失败!");
}
}
//删除数据
//删除
- (IBAction)deleteData:(id)sender {
//删除指定姓名的人
BOOL result=[self.db executeUpdate:@"delete from t_student where name=? ",@"赵三"];
//删除所有
// BOOL result =[self.db executeUpdate:@"delete from t_student"];
if (result) {
NSLog(@"删除成功!");
}else{
NSLog(@"删除失败!");
}
}
//查询数据
//查询数据
- (IBAction)qurey:(id)sender {
//查询指定姓名的信息
// FMResultSet *rs =[self.db executeQuery:@"select * from t_student where name like ?",@"冯倩"];
//查询所有信息
FMResultSet *rs=[self.db executeQuery:@"select *from t_student "];
//[rs next]会从顶部往下查询内容 一直到底部 返回值就会为NO
while ([rs next]) {
int ID =[rs intForColumn:@"id"];
int age=[rs intForColumn:@"age"];
NSString * name =[rs stringForColumn:@"name"];
NSLog(@"%d,%d,%@",ID,age,name);
}
//关闭数据库
[self.db close];
}
//该FMdatabase线程是不安全的 我们可以使用FMDatabaseQueue来解决线程问题
@property(nonatomic,strong)FMDatabaseQueue * queue;
//获取沙盒的路径
NSString * filename=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"student.db"];
//创建数据库队列实例对象
self.queue =[FMDatabaseQueue databaseQueueWithPath:filename];
[self.queue inDatabase:^(FMDatabase *db) {
//创建数据库表
BOOL result= [db executeUpdate:@"create table if not exists t_student(id integer primary key autoincrement ,name text,age integer)"];
if (result) {
NSLog(@"创建表成功!");
}else{
NSLog(@"创建表失败!");
}
}];
由于重复我在写一个修改
[self.queue inDatabase:^(FMDatabase *db) {
BOOL result =[db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
if (result) {
NSLog(@"修改数据成功!");
}else{
NSLog(@"修改数据失败!");
}
}];
如果我们需要处理多件事情并且要让这多件事情 都完成 或者 都不完成 (只要一件事情没有完成,那么都不会完成)
[self.queue inDatabase:^(FMDatabase *db) {
//开启事务 如果我们需要处理几件事情并且要让这几件事情都完成或者都不完成 (只要一件事情没有完成,那么都不会完成)
[db beginTransaction];
[db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
[db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
if (如果发现情况不对) {
//回滚事务
[db rollback];
[db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
}
//提交事务
[db commit];
[db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];}];