1、什么是FMDB

 1.   iOS中原生的SQLite API在使用上相当不好用,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的代码库,例如FMDB、   

PlausibleDatabase、SQLitePersistentObjects等

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

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

 

2.FMDB的优点

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

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

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

2、FMDB下载地址:FMDB (https://github.com/ccgus/fmdb

常用类

FMDB有三个主要的类

(1)FMDatabase

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

用来执行SQL语句

 

(2)FMResultSet

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

 

(3)FMDatabaseQueue

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

4、FMDB使用:github上下载过代码后,工程中必须导入src→fmdb文件夹;

内部代码实现:实际上用的还是系统的SQLite3 API 

ios开发之数据库 ios 数据库app_数据库

FMDB这个库里面的源码,发现调用的是系统的SQLite3 API

编译之后,会报很多错误

ld: symbol(s) not found for architecture i386

解决:导入系统库

导入第三方库

a、创建数据库根据文件路径、创建数据库 根据路径

b、打开数据库如果数据库存在 就直接打开如果不存在 先创建数据库然后再打开

c、设置缓存提高执行效率

d、判断数据库中是否存在表创建表 数据库的增、删、改操作都用executeUpdate

打开数据库,设置缓存

- (void)openDatabase
{
    //1.打开数据库
    if (![_database open]) {
        //关闭数据库
        [_database close];
        NSAssert(NO, @"数据库打开失败");
    }
    
    //2.设置缓存,为了提高执行效率
    [_database setShouldCacheStatements:YES];

}




创建表DDL

- (void)createTable
{
    [self openDatabase];
    
    //3.执行创建表的sql语句:判断数据库中是否存在此表
    //ContactTable
    if (![_database tableExists:@"ContactTable"]) {
        //表的创建、添加、删除、更新:执行sql语句的方法相同:executeUpdate:
        BOOL isOk = [_database executeUpdate:@"CREATE TABLE ContactTable (name TEXT,phone TEXT)"];
        if (isOk) {
            NSLog(@"表创建成功");
        }else{
            NSLog(@"表创建失败");
        }
    }
    //关闭数据库
    [_database close];
}




1、查

打开数据库 ,设置缓存,执行查询语句, 返回一个结果集executeQuery, while循环逐步取出结果集中的数据,取出不同的数据赋值给对象的属性, 然后放入数组  , 关闭结果集

- (IBAction)queryData:(id)sender
{
    
    NSMutableArray* mArray = [NSMutableArray array];
    
    //打开数据库并设置缓存
    [self openDatabase];
    //查询:DQL:  executeQuery:
    
    //设置查询结果集
    FMResultSet* resultSet = [_database executeQuery:@"SELECT * FROM ContactTable"];

    //next 逐步取出结果集中的数据,返回YES:表示还有下一条数据,并且会切换到下一条数据,NO:没有下一条数据,停止查询
    while ([resultSet next]) {
        //结果集中取值:两种:(1)根据字段名取值(2)根据字段索引取值
        NSString* nameStr = [resultSet stringForColumn:@"name"];
        NSString* phoneStr = [resultSet stringForColumn:@"phone"];
        
        //封装成对象 装在数组中:
        [mArray addObject:nameStr];
        [mArray addObject:phoneStr];
    }
    
    //取出数据
    for (id object in mArray) {
        NSLog(@"-----%@",object);
    }
    
    [_database close];
}




2、增

打开数据库设置缓存 执行插入语句关闭数据库 

- (IBAction)insertData:(id)sender
{
    //1.打开数据库,并设置缓存
    [self openDatabase];
    
    NSString* name = @"zhangsan";
    NSString* phone = @"12345678";
    
    //2.执行sql
    BOOL isInsert = [_database executeUpdate:@"INSERT INTO ContactTable VALUES(?,?)",name,phone];
    if (isInsert) {
        NSLog(@"插入数据成功");
    }else{
        NSLog(@"插入数据失败");
    }
    
    //关闭数据库
    [_database close];
    
}




3、删

打开数据库设置缓存 执行删除语句关闭数据库 

- (IBAction)deleteData:(id)sender
{
    //1.打开数据库
    [self openDatabase];
    
    BOOL isDelete = [_database executeUpdate:@"DELETE FROM ContactTable WHERE name = 'zhangsan'"];
    if (isDelete) {
        NSLog(@"删除成功");
    }else{
        NSLog(@"删除失败");
    }
    
    [_database close];
}