FMDB的使用
https://github.com/ccgus/fmdb
FMDB是iOS平台的建立在SQLite数据库框架,以objective-c的方式封装了SQLite的C语言API。
FMDB使用时更加面向对象,省去了很多麻烦、冗余的C语言代码;提供了多线程安全的数据库操作方法。
FMDB有三个主要的类
1、FMDatabase:表示一个单独的SQLite数据库。 用来执行SQLite的命令。
2、FMResultSet:表示FMDatabase执行查询后结果集
3、FMDatabaseQueue:如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的。
// 四种语句等价方法
// 1. 直接使用完整的SQL更新语句
[database executeUpdate:@"insert into mytable(num,name,sex) values(0,'liuting','m');"];
2. 使用不完整的SQL更新语句,里面含有待定字符串"?",需要后面的参数进行替代
NSString *sql = @"insert into mytable(num,name,sex) values(?,?,?);";
[database executeUpdate:sql,@0,@"liuting",@"m"];
// 3. 使用不完整的SQL更新语句,里面含有待定字符串"?",需要数组参数里面的参数进行替代
[database executeUpdate:sql withArgumentsInArray:@[@0,@"liuting",@"m"]];
// 4. SQL语句字符串可以使用字符串格式化,这种我们应该比较熟悉
[database executeUpdateWithFormat:@"insert into mytable(num,name,sex) values(%d,%@,%@);",0,@"liuting","m"];
常用方法
1、实例
+(instancetype)databaseWithPath:(NSString*)inPath;
-(instancetype)initWithPath:(NSString*)inPath;
2、数据库操作
(1)打开
- (BOOL)open;
(2)关闭
- (BOOL)close;
3、表操作、数据操作
表的创建、删除,及数据的插入、修改、删除、查找操作都是执行SQL语句。
(1)创建、删除,及插入、修改、删除(sql语句后可接不确定值字条串)
- (BOOL)executeUpdate:(NSString*)sql, ...;
(2)查找
- (FMResultSet*)executeQuery:(NSString*)sql, ...;
- (BOOL)next;
-(NSString*)stringForColumn:(NSString*)columnName;
示例代码:
导入头文件#import "FMDatabase.h" 或 #import "FMDatabaseQueue.h"
设置数据库路径
- (NSString *)filePath
{
if (!_filePath)
{
// document目录下
NSArray *documentArray =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *document = [documentArray objectAtIndex:0];
_filePath = [document stringByAppendingPathComponent:SQLiteFile];
}
NSLog(@"filePath %@", _filePath);
return _filePath;
}
#pragma mark - 非多线程管理数据库
创建实例(懒加载)
- (FMDatabase *)dataBase
{
if (!_dataBase)
{
_dataBase = [FMDatabase databaseWithPath:self.filePath];
}
return _dataBase;
}
创建新表
- (void)New
{
if ([self.dataBase open])
{
NSLog(@"打开数据库成功");
// 创建数据表
BOOL result = [self.dataBase executeUpdate:@"CREATE TABLE if notexists Company (departmentId text PRIMARY KEY,departmentNametext,departmentStatus text)"];
if (result)
{
NSLog(@"创建表成功");
}
else
{
NSLog(@"创建表失败");
}
[self.dataBase close];
}
else
{
NSLog(@"打工数据库失败");
}
}
插入数据
- (void)Insert
{
if ([self.dataBase open])
{
NSLog(@"打开数据库成功");
BOOL result = [self.dataBase executeUpdate:@"INSERT INTO Company(departmentId,departmentName,departmentStatus)VALUES(?,?,?)",@"168",@"互联网部门",@"禁用"];
if (result)
{
NSLog(@"插入数据成功");
}
else
{
NSLog(@"插入数据失败");
}
[self.dataBase close];
}
else
{
NSLog(@"打工数据库失败");
}
}
修改更新数据
- (void)Update
{
if ([self.dataBase open])
{
NSLog(@"打开数据库成功");
// 更新数据库,改变状态
BOOL result = [self.dataBase executeUpdate:@"update Company setdepartmentStatus=? where departmentName=?",@"启用",@"互联网部门"];
if (result)
{
NSLog(@"更新数据成功");
}
else
{
NSLog(@"更新数据失败");
}
[self.dataBase close];
}
else
{
NSLog(@"打工数据库失败");
}
}
查找数据
- (void)Select
{
if ([self.dataBase open])
{
NSLog(@"打开数据库成功");
FMResultSet *rs = [self.dataBase executeQuery:@"select * fromCompany"];
while ([rs next])
{
NSString *idStr = [rs stringForColumn:@"departmentId"];
NSString *nameStr = [rs stringForColumn:@"departmentName"];
NSString *statusStr = [rsstringForColumn:@"departmentStatus"];
NSLog(@"查找数据成功。id=%@,name=%@,status=%@", idStr, nameStr, statusStr);
}
[self.dataBase close];
}
else
{
NSLog(@"打工数据库失败");
}
}
单条数据时
if ([rs next])
{
NSString *idStr = [rs stringForColumn:@"departmentId"];
NSString *nameStr = [rs stringForColumn:@"departmentName"];
NSString *statusStr = [rsstringForColumn:@"departmentStatus"];
NSLog(@"查找数据成功。id=%@,name=%@,status=%@", idStr, nameStr, statusStr);
}
删除数据
- (void)Delete
{
if ([self.dataBase open])
{
NSLog(@"打开数据库成功");
// 清空表格数据
BOOL result = [self.dataBase executeUpdate:@"DELETE FROMCompany"];
if (result)
{
NSLog(@"删除数据成功");
}
else
{
NSLog(@"删除数据失败");
}
[self.dataBase close];
}
else
{
NSLog(@"打工数据库失败");
}
}
#pragma mark - 多线程管理数据库
创建实例(懒加载)
- (FMDatabaseQueue *)dataBaseQueue
{
if (!_dataBaseQueue)
{
_dataBaseQueue = [FMDatabaseQueue databaseQueueWithPath:self.filePath];
}
return _dataBaseQueue;
}
- (void)multithread
{
dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);
dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);
dispatch_async(q1, ^{
[self.dataBaseQueue inDatabase:^(FMDatabase *db) {
NSString *sql = @"insert into Company (departmentId,departmentName, departmentStatus) values(?, ?, ?) ";
BOOL result = [db executeUpdate:sql, @"100", @"综合部",@"禁用"];
if (result)
{
NSLog(@"1 多线程 插入数据成功");
}
else
{
NSLog(@"1 多线程 插入数据失败");
}
}];
});
dispatch_async(q2, ^{
[self.dataBaseQueue inDatabase:^(FMDatabase *db) {
NSString *sql = @"insert into Company (departmentId,departmentName, departmentStatus) values(?, ?, ?) ";
BOOL result = [db executeUpdate:sql, @"110", @"业务部",@"禁用"];
if (result)
{
NSLog(@"2 多线程 插入数据成功");
}
else
{
NSLog(@"2 多线程 插入数据失败");
}
}];
});
}
数据查看
注意事项:
1、使用时,必须添加相关框架,及导入头文件
(1)libsqlite3.tbd
(2)FMDB
(3)#import"FMDatabase.h"或 #import "FMDatabaseQueue.h"
2、sql语句可以使用objective-c格式。如:
NSString*sql = @"DELETE FROM Company";
3、sql语句中不确定值使用?表示。如:
NSString*sql = @"update Company set departmentStatus=? wheredepartmentName=?";
4、executeUpdate、executeQuery语句格式可包含多个字符串。如:
NSString*sql = @"insert into Company (departmentId, departmentName,departmentStatus) values(?, ?, ?) ";
BOOLresult = [db executeUpdate:sql, @"110", @"业务部",@"禁用"];
5、涉及到多线程使用时,使用类FMDatabaseQueue。