fmdb简介与使用

当我们需要用到 sql 数据库时 通常使用 fmdb 框架
先贴出 github 地址 https://github.com/ccgus/fmdb

什么是fmdb?
fmdb是iOS平台的SQLite数据库框架
fmdb以OC的方式封装了SQLite的C语言API

其优点:
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地防止数据混乱

fmdb有三个主要的类:
FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句

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

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

首先通过指定路径创建 FMDatabase对象
设置路径后
FMDatabase *db = [FMDatabase databaseWithPath:path];

贴个简单示例代码:

.h
#import <Foundation/Foundation.h>
@interface database : NSObject

+ (NSMutableArray *)getData;

+ (void)addMusic:(NSString *)name :(NSString *)singerName :(NSString *)url;

+ (void)delMusic:(NSString *)name :(NSString *)singerName;

@end
.m
#import "database.h"
#import "FMDB.h"
@implementation database

static FMDatabase *_db;


/*
//注释
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题

为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类

FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
*/


+ (void)initialize
{
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"music.sqlite"];
    //NSLog(@"%@", path);
    _db = [FMDatabase databaseWithPath:path];

/*
//注释
文件路径有三种情况
1、
具体文件路径
如果不存在会自动创建
2、
空字符串@""
会在临时目录创建一个空的数据库
当FMDatabase连接关闭时,数据库文件也被删除
3、
nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
*/

    [_db open];

    [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_music (id integer PRIMARY KEY, name text NOT NULL, singer text NOT NULL, URL text NOT NULL);"];

}

/*
//注释
在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等

使用executeUpdate:方法执行更新
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

示例
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
*/


+ (void)addMusic:(NSString *)name :(NSString *)singerName :(NSString *)url
{
    NSMutableArray *array = [database getData];
    for (NSArray *arr in array) {
        if (arr.count != 0) {
            if (name == arr[0] && singerName == arr[1] && url == arr[2]) {
                return;
            }
        }
    }
        [_db executeUpdateWithFormat:@"INSERT INTO t_music(name, singer, URL) VALUES (%@, %@, %@);", name, singerName, url];

}

+ (void)delMusic:(NSString *)name :(NSString *)singerName
{
    [_db executeUpdateWithFormat:@"DELETE FROM t_music WHERE name = %@ AND singer = %@;", name, singerName];


/*
//注释

查询方法
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

示例
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍历结果集
while ([rs next]) {
    NSString *name = [rs stringForColumn:@"name"];
    int age = [rs intForColumn:@"age"];
    double score = [rs doubleForColumn:@"score"];
}
*/
}


+ (NSMutableArray *)getData
{// 得到结果集
    FMResultSet *set = [_db executeQuery:@"SELECT * FROM t_music;"];

    NSMutableArray *array = [NSMutableArray array];
    // 不断往下取数据

    while (set.next) {
        // 获得当前所指向的数据
        NSMutableArray *arr = [NSMutableArray array];

        NSString *name = [set stringForColumn:@"name"];
        NSString *singer = [set stringForColumn:@"singer"];
        NSString *url = [set stringForColumn:@"URL"];


        [arr addObject:name];
        [arr addObject:singer];
        [arr addObject:url];

        [array addObject:arr];

    }
    return array;

}

FMDB的FMResultSet提供了多个方法来获取不同类型的数据
想取什么类型就写 类型名ForColumn

顺便整理一下SQLite函数


//1.打开数据库
int sqlite3_open(
    const char *filename,   // 数据库的文件路径
    sqlite3 **ppDb          // 数据库实例
);

//2.执行任何SQL语句
int sqlite3_exec(
    sqlite3*,                                  // 一个打开的数据库实例
    const char *sql,                           // 需要执行的SQL语句
    int (*callback)(void*,int,char**,char**),  // SQL语句执行完毕后的回调
    void *,                                    // 回调函数的第1个参数
    char **errmsg                              // 错误信息
);

//3.检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_v2(
    sqlite3 *db,            // 数据库实例
    const char *zSql,       // 需要检查的SQL语句
    int nByte,              // SQL语句的最大字节长度
    sqlite3_stmt **ppStmt,  // sqlite3_stmt实例,用来获得数据库数据
    const char **pzTail
);

//4.查询一行数据
int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW

//5.利用stmt获得某一字段的值(字段的下标从0开始)
double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮点数据
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字符串数据

关于多线程操作数据库请看:
http://blog.csdn.net/xyz_lmn/article/details/9312837

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值