iOS开发FMDB

来源:互联网 发布:voip软件电话 编辑:程序博客网 时间:2024/05/22 07:08

一、概述

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


1 0