zoukankan      html  css  js  c++  java
  • 李洪强经典面试题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. n通过指定SQLite数据库文件路径来创建FMDatabase对象

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

      13. if (![db open])

      14. {

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

      16. }

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

      18. p具体文件路径

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

      20. ü p空字符串@""

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

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

      23. p pnil

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

      25. 执行更新 

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

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

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

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

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

      31. p n示例

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

      33. 执行查询 

      34. n查询方法

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

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

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

      38. p n示例

      39. // 查询数据

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

      41. // 遍历结果集

      42. while ([rs next])

      43. {

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

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

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

      47. }

    李洪强

    在面试的时候,如果问数据库怎么搞得,不能只说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(@"添加数据失败");

               }

           }

       }];

        

    }

    查询

  • 相关阅读:
    OpenERP 7.0 中文报表PDF乱码(WindowsXP)
    【转】CentOS 6.3 X64自动安装OpenERP 7.0脚本
    OE7设置菜单为什么这么少?
    PostgreSQL的备份和恢复
    PyPI镜像网站
    【转】Win 7 下源码运行OpenERP7.0
    OpenERP中的会计凭证
    OpenERP实施记录(14):收款处理
    OpenERP实施记录(13):出库处理
    intro.js 页面引导简单用法
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/5802912.html
Copyright © 2011-2022 走看看