李洪强经典面试题31- FMDB

 

n什么是FMDB 

pFMDB是iOS平台的SQLite数据库框架

pFMDB以OC的方式封装了SQLite的C语言API

p nFMDB的优点 

p使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码 

p对比苹果自带的Core Data框架,更加轻量级和灵活 

p提供了多线程安全的数据库操作方法,有效地防止数据混乱

p nFMDB的github地址

phttps://github.com/ccgus/fmdb p

 

 

    1. 核心类 

    2. nFMDB有三个主要的类

    3. pFMDatabase

    4. ü一个FMDatabase对象就代表一个单独的SQLite数据库

    5. ü用来执行SQL语句

    6. ü pFMResultSet

    7. ü使用FMDatabase执行查询后的结果集

    8. ü pFMDatabaseQueue

    9. ü用于在多线程中执行多个查询或更新,它是线程安全的

    10.  

    11.  

    12. 打开数据库 

    13. n通过指定SQLite数据库文件路径来创建FMDatabase对象

    14. FMDatabase *db = [FMDatabasedatabaseWithPath:path];

    15. if (![db open])

    16. {

    17.     NSLog(@"数据库打开失败!");

    18. }

    19. n n文件路径有三种情况

    20. p具体文件路径

    21. ü如果不存在会自动创建

    22. ü p空字符串@""

    23. ü会在临时目录创建一个空的数据库

    24. ü当FMDatabase连接关闭时,数据库文件也被删除

    25. p pnil

    26. ü会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

    27.  

    28. 执行更新 

    29. n在FMDB中,除查询以外的所有操作,都称为“更新”pcreate、drop、insert、update、delete等

    30. p n使用executeUpdate:方法执行更新

    31. p- (BOOL)executeUpdate:(NSString*)sql, ...

    32. p- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

    33. p- (BOOL)executeUpdate:(NSString*)sqlwithArgumentsInArray:(NSArray *)arguments

    34. p n示例

    35. [db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

    36. 执行查询 

    37.  

    38. n查询方法

    39. p- (FMResultSet *)executeQuery:(NSString*)sql, ...

    40. p- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

    41. p- (FMResultSet *)executeQuery:(NSString *)sqlwithArgumentsInArray:(NSArray *)arguments

    42. p n示例

    43. // 查询数据

    44. FMResultSet *rs = [db executeQuery:@"SELECT * FROMt_student"];

    45.  

    46. // 遍历结果集

    47. while ([rs next])

    48. {

    49.     NSString *name = [rs stringForColumn:@"name"];

    50.     int age = [rs intForColumn:@"age"];

    51.     double score = [rs doubleForColumn:@"score"];

    52. }

    53.  

    54.  

    55.  

    56.  

    57.  

    58.  

    59.  

    60.  

    61.  

    62.  

    63.  

    64.  

    65.  

    66.  

    67.  

    68.  

    69.  

    70.  

    71.  

    72.  

    73.  

    74.  

    75.  

    76.  

    77.  

    78.  

    79.  

    80.  

    81.  

    82.  

    83.  

    84.  

    85.  

    86.  

李洪强

 

 

在面试的时候,如果问数据库怎么搞得,不能只说FMDB

可以这样说:

我用SQLite,FMDB也会封装这些东西,也会做一些改变,所以最终用这个框架去实现

 

 

 

用终端下载第三方框架

在桌面新建文件夹gitHub

 

 

输入 cd  拖入新建文件夹  回车  输入 git clone 把在github里下载第三方框架的地址拷贝过来 回车

 

 

现在就是正在下载的状态了...

 

在xcode 新建项目导入新框架

 

 

在项目里导入FMDB的头文件

 

#import "FMDB.h"

 

 

 

定义一个全局的属性dataBase

 

@property(nonatomic,strong)FMDatabase *dataBase;

 

判断数据库是否打开成功

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // 1 - 创建数据库

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"student"];

    

    FMDatabase *dataBase = [FMDatabasedatabaseWithPath:path];

    self.dataBase = dataBase;

    BOOL success = [dataBase open];

    

    if (success) {

        

        NSLog(@"数据库创建成功");

    }else{

        NSLog(@"数据库创建失败");

    }



判断是否创建成功,只有创建成功才去执行第二步

2 - 创建表

执行 - 只要不是查询都用updata 更新

 

 //2 - 创建表

    NSString *str = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL ,score REAL NOT NULL)";

        

    //执行

        [self.dataBase executeUpdate:str];

   

    }else{

        NSLog(@"数据库创建失败");

    }

做一个插入,一个查询,因为查询有代表性

 

- (IBAction)insertData:(UIButton *)sender {

//插入数据

    for (int i = 0; i < 100; i ++) {

        NSString *nameStr = [NSString stringWithFormat:@"周杰伦 - %d",i];

        NSString *sqlStr = [NSStringstringWithFormat:@"INSERT INTO t_student (name,score)VALUES('%@',%.2f)",nameStr,arc4random_uniform(1000)/10.0];

        //执行

        BOOL success = [self.dataBase executeUpdate:sqlStr];

        if (success) {

            

            NSLog(@"添加成功");

        }else{

            NSLog(@"添加失败");

        }

        

    }

 

 

 

next方法

如果是YES,取到数据了

如果是NO 没有取到数据

如果取到,应该把两个数据拿出来

一个是name ,一个是score

 

 

 

 

用SQL和FMDB的使用的区别

 

线程安全

公共资源A使用的时候,B不能使用

一个公共的 值是100

A对公共的执行操作完成之前

B不能操作

 

在最新值的基础上再进行操作

 

操作之前连读取都不能

排队

A执行完成之后写到数据库,才是结束

 

枷锁

 

用FMDB加锁

 

 

 

新建一个项目: FMDB的线程安全

 

导入框架

一个是拖入框架,一个是导入系统的sql

 

 

 

1 - 指定沙盒路径

 

2 - 创建数据库队列 

 

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    //指定沙盒路径

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"data.sqlite"];

    //创建数据库的队列

    FMDatabaseQueue *dataBaseQ = [FMDatabaseQueuedatabaseQueueWithPath:path];

    //线程安全

    [dataBaseQ inDatabase:^(FMDatabase *db) {

        BOOL success = [db open];

        if (success) {

            NSLog(@"创建库成功");

       //2 - 创建数据库成功了,我才去创建表

      NSString *str = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL ,score REAL NOT NULL)";

            if ([db executeUpdate:str]) {

                NSLog(@"创建表成功");

            }else{

                NSLog(@"创建表失败");

            }

        

        

        }else{

            NSLog(@"创建库失败");

        }

        

    }];

}

接下来演示线程安全下的添加和查询数据

把创建的队列定义一个全局的属性

- (IBAction)insertData:(UIButton *)sender {

//线程安全下的增加数据

   [self.dataBaseQ inDatabase:^(FMDatabase *db) {

       for (int i = 0; i < 100; i ++) {

        NSString *nameStr = [NSString stringWithFormat:@"周杰伦 - %d",i];

           NSString *sqlStr = [NSStringstringWithFormat:@"INSERT INTO t_student (name,score)VALUES('%@,%.2f)",nameStr,arc4random_uniform(1000)/10.0];

           

           BOOL success = [db executeUpdate:sqlStr];

           if (success) {

               NSLog(@"添加数据成功");

           }else{

               NSLog(@"添加数据失败");

           }

       }

   }];

    

 

}

 

查询

 

posted @ 2016-08-24 14:43  李洪强  阅读(1791)  评论(0编辑  收藏  举报