一、概述
FMDB是iOS平台的SQLite数据库框架,用OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了冗余的C语言代码,比苹果自家的CoreData框架更加灵活,提供了多线程安全的数据库操作方法,防止才出现数据混乱现象。
FMDB有三个核心类:FMDatabase(用来执行SQL语句,一个FMDBDatabase对象代表一个单独的SQLite数据库);FMResultSet(执行查询后的结果集);FMDatabaseQueue(多线程中执行多个查询或更新)。
二、示例代码
(1)首先导入libsqlite3.tbd库文件并且在github上(https://github.com/ccgus/fmdb)下载FMDB框架导入工程
(2)创建数据库路径
文件路径有三种情况:1.具体文件路径(如果不存在会自动创建);
2.传入的参数是空字符串@“”,会在临时目录下创建这个数据库,当FMDB断开连接的时候会删除这个数据库文件。
3.传入的参数是NULL,会创建一个在内存中的数据库,断开连接时数据库文件被删除。
//获取Document路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//在此路径下新建一个文件
NSString *fliepath = [doc stringByAppendingPathComponent:@"student.sqlite"];
(3)创建数据库
//创建一个数据库
FMDatabase *database = [FMDatabase databaseWithPath:fliepath
];
(4)创建列表
//创建列表
if ([database open]) {
BOOL result = [database 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(@"列表创建失败");
}
}
(5)对列表进行增删改查操作
增:
#pragma mark -- 增 (插入数据)
-(void)insert{
if ([self.database open]) {
for (int i = 0; i < 5 ; i ++) {
NSString *name = [NSString stringWithFormat:@"xiao-%d",i];
[self.database executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name,@(arc4random()%40)];
}
//关闭数据库
[self.database close];
}
}
删一个:
#pragma mark -- 删除某一条数据
-(void)deleteOne{
if ([self.database open]) {
NSString *deleteOneSQL = [NSString stringWithFormat:@"delete from t_student where name = '%@'",@"xiao-0"];
[self.database executeUpdate:deleteOneSQL];
[self.database close];
}
}
全部删除:
#pragma mark -- 删除所有的数据
-(void)deleteAll{
if ([self.database open]) {
[self.database executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
[self.database close];
}
}
改数据:
#pragma mark -- 修改数据
-(void)change{
if ([self.database open]) {
NSString *changeSQL = [NSString stringWithFormat:@"UPDATE t_student SET name = '%@' WHERE id = '%d'",@"xiao-9",2];
[self.database executeUpdate:changeSQL];
[self.database close];
}
}
查询:
#pragma mark -- 查询
-(void)search{
if ([self.database open]) {
FMResultSet *result = [self.database executeQuery:@"SELECT *FROM t_student"];
while ([result next]) {
int ID = [result intForColumn:@"id"];
NSString *name = [result stringForColumn:@"name"];
int age = [result intForColumn:@"age" ];
NSLog(@"id = %d ,name = %@ ,age = %d",ID,name,age);
}
[self.database close];
}
}
Appdelegate.m中
#import "AppDelegate.h"
#import "FMDB.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//获取Document路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//在此路径下新建一个文件
NSString *fliepath = [doc stringByAppendingPathComponent:@"student.sqlite"];
//创建一个数据库
_database = [FMDatabase databaseWithPath:fliepath];
//创建列表
if ([_database open]) {
BOOL result = [_database 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(@"列表创建失败");
}
}
// Override point for customization after application launch.
return YES;
}
viewController.m中
#import "ViewController.h"
#import "FMDB.h"
@interface ViewController ()
@property(nonatomic,strong)FMDatabase *database;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.database = [FMDatabase databaseWithPath:[self getPath]];
if (![self.database open]) {
return;
}
NSString *existsSql = [NSString stringWithFormat:@"select count(name) as countNum from sqlite_master where type = 'table' and name = '%@'",@"t_student"];
FMResultSet *resultSet = [self.database executeQuery:existsSql];
if ([resultSet next]) {
NSInteger count = [resultSet intForColumn:@"countNum"];
NSLog(@"count = %ld",count);
if (count == 1) {
//增
[self insert];
// [self deleteAll];
//查
[self search];
}
}
// [self deleteAll];
// //增
// [self insert];
// //删一个
// [self deleteOne];
// //改
// [self change];
//
// //查
// [self search];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark -- 增 (插入数据)
-(void)insert{
for (int i = 0; i < 1 ; i ++) {
NSString *name = [NSString stringWithFormat:@"xiao-%d",i];
[self.database executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name,@(arc4random()%40)];
}
}
#pragma mark -- 删除某一条数据
-(void)deleteOne{
NSString *deleteOneSQL = [NSString stringWithFormat:@"delete from t_student where name = '%@'",@"xiao-0"];
[self.database executeUpdate:deleteOneSQL];
[self.database close];
}
#pragma mark -- 删除所有的数据
-(void)deleteAll{
[self.database executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
}
#pragma mark -- 修改数据
-(void)change{
NSString *changeSQL = [NSString stringWithFormat:@"UPDATE t_student SET name = '%@' WHERE id = '%d'",@"xiao-9",2];
[self.database executeUpdate:changeSQL];
}
#pragma mark -- 查询
-(void)search{
FMResultSet *result = [self.database executeQuery:@"SELECT *FROM t_student"];
while ([result next]) {
int ID = [result intForColumn:@"id"];
NSString *name = [result stringForColumn:@"name"];
int age = [result intForColumn:@"age" ];
NSLog(@"id = %d ,name = %@ ,age = %d",ID,name,age);
}
}
#pragma mark -- 获取路径的方法
-(NSString *)getPath{
//获取Document路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//在此路径下拼接新建一个文件
NSString *fliepath = [doc stringByAppendingPathComponent:@"student.sqlite"];
return fliepath;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end