您的位置:首页 > 其它

实用知识:FMDB使用示例(常用)

2016-05-25 11:14 288 查看
#import "ViewController.h"
#import <FMDB/FMDB.h>

@interface ViewController ()
@property (nonatomic,strong) FMDatabase *db;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
//获取沙盒Document的路径
NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject];
//在路径末端加上数据库名字,后缀.db 结尾,如果无此数据库,会自动创建
NSString *filename = [doc stringByAppendingPathComponent:@"T_SQLTest.db"];
//创建数据库,传一个路径即可
self.db = [FMDatabase databaseWithPath:filename];
//判断数据库是否打开
if ([self.db open]) {
NSLog(@"数据库打开成功");
//打开成功就可以创建表T_Student,id 是主键,name 与 age 是字段,NOT NULL表示不能为空,
BOOL result = [self.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(@"创建表成功");
}

/*================ 插入命令 ================*/
NSString *name = @"WW";
int age = 123;
//executeUpdate:不确定的参数用?来占位(后面参数必须是oc对象,;代表语句结束)
[self.db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES(?,?);",name,@(age)];

//executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)
[self.db executeUpdateWithFormat:@"INSERT INTO T_Student (name,age) VALUES(%@,%i);",name,age];

//参数是数组的使用方式
[self.db executeUpdate:@"INSERT INTO t_student(name,age) VALUES  (?,?);"withArgumentsInArray:@[name,@(age)]];

/*================ 删除命令 ================*/
int idNum = 2;
//不确定的参数用?来占位 (后面参数必须是oc对象,需要将int包装成OC对象)
[self.db executeUpdate:@"DELETE FROM T_Student WHERE id = ?;",@(idNum)];
//不确定的参数用%@,%d等来占位
[self.db executeUpdateWithFormat:@"DELETE FROM T_Student WHERE name = %@;",name];

/*================ 修改命令 ================*/
[self.db executeUpdate:@"UPDATE T_Student SET name = 'BB' WHERE name = '123';"];

/*================ 查询命令 ================*/
//根据条件查询
FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM T_Student WHERE age>14;"];
//查询这个表用*号
resultSet = [self.db executeQuery:@"SELECT * FROM T_Student"];
NSString *RSName;
int RSAge;
int RSid;
//遍历resultSet对象,输出查询结果
while ([resultSet next]) {
//用resultSet对象来调用方法,方法返回值为查询结果
RSid = [resultSet intForColumn:@"id"];
RSName = [resultSet stringForColumn:@"name"];
RSAge = [resultSet intForColumn:@"age"];
NSLog(@"id:%d,name:%@,age:%d",RSid,RSName,RSAge);
}

/*================ 销毁命令 ================*/
[self.db executeUpdate:@"DROP TABLE IF EXISTS T_Student;"];

/*================ FMDB 多线程使用 ================*/
/**
*  FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题,为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
*/
//1.创建队列,路径传要操作的数据库的文件路径
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filename];
//定义一个 bool 值对象,每次执行操作都会返回,通过返回值判断是否操作成功,不成功就return
__block BOOL whoopsSomethingWrongHappened = true;

//2.把任务包装到事务里
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
whoopsSomethingWrongHappened &=  [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('cc',33);"];
whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('dd',44);"];

whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('gg',55);"];
//如果有错误 返回
if (!whoopsSomethingWrongHappened) {
*rollback = YES;
return;
}
}];
}
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: