笔记-FMDB

栏目: 数据库 · 发布时间: 5年前

内容简介:一个轻量级的关系型数据库,FMDB是iOS平台的FMDB常用的三个类:

一个轻量级的关系型数据库, SQLite 不区分大小写,但是也有注意的地方, GLOBglob 具有不同作用。另外有5中基本数据类型 text、integer、real、boolean、blob

SQLite的使用方法

libsqlite3.tbd
#improt<sqlite3.h>

FMDB

FMDB是iOS平台的 SQLite 数据库框架,以OC的方式封装了 SQLite 的C语言API

FMDB常用的三个类:

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

FMResultSet : 使用 FMDatabase 执行查询后的结果集合 FMDatabaseQueue : 用于多线程中执行多个查询或更新,它是线程安全的

FMDB的创建和使用方法

  • 下载FMDB( GitHub ),然后拖入工程中,也支持pod导入
  • 在工程中添加 libsqlite3.tbd 的依赖库
  • 引入头文件 #import "FMDatabase.h"
  • 代码的实现:创建库路径->创建数据库->打开数据库->创建表->对数据库进行操作->关闭数据库

创建库路径

iOS本地优化存储的数据保存在沙盒中,并且每个应用的沙盒是相对独立的,每个应用的沙盒文件结构都是相同的,如下图所示:

笔记-FMDB

Documents:iTunes会备份改目录,一般用来存储需要持久化的数据。

Library/Caches:缓存,iTunes不会备份该目录。内存不足时会被清除,应用没有运行时,可能会被清除。一般存储体积大,不需要备份的非重要数据。

Library/Preference:iTunes会备份该目录,可以用来存储一些偏好设置。

tmp:iTunes不会备份这个目录,用来保存临时数据,应用退出时会清除该目录下的数据。

创建路径

笔记-FMDB

上面的方法有三个参数,说明一下:

NSDocumentDirectory:第一个参数代表要查找哪个文件,是一个枚举,为了直接找到沙盒中的Documents目录,我们一般用NSDocumentDirectory。

NSUserDomainMask:也是一个枚举,表示搜索的范围限制于当前应用的沙盒目录。

YES:第三个参数是一个BOOL值,iOS中主目录的全写形式是/User/userName,这个参数填YES就表示全写,填NO就是“~”,一般使用YES。

通过制定 SQLite 数据库文件的路径来创建一个 FMDatabase ,路径可以是一下几种方式中的任何一种

  • 完整的路径,如果路径不存在,会自动创建。
  • 空字符串@"",会自动在缓存区创建一个空的数据库, FMDatabase 连接关闭时,数据库会被自动删除。
  • 路径为 NULL ,会在内存中创建一个数据库,同样的,在 FMDatabase 连接关闭时,数据库会被自动删除。

打开数据库,创建表

使用 open 语句打开数据库,打开成功返回 YES ,打开失败返回 NO

笔记-FMDB

执行数据库操作

一般情况下,我们最常用的两个方法

db executeQuery:(NSString*)sql, ...
db executeUpdate:(NSString*)sql, ...
复制代码
create、drop、insert、update、delete、alter、commit、begin、detach、explain、vacuum、replace
select

关闭数据库

[db close];
复制代码

FMDatabaseQueue

FMDatabase 是线程不安全的,当FMDB数据存储想要使用多线程的时候, FMDatabaseQueue 就能够用上了。

初始化 FMDatabaseQueue 的方法与 FMDatabase 类似

笔记-FMDB

通过网上资料的查找有关其他API的解读,这里说一下

更新

- (BOOL)executeUpdate:(NSString*)sql, ...;
- (BOOL)executeUpdateWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
- (BOOL)executeUpdate:(NSString*)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error;
- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments;
- (BOOL)executeUpdate:(NSString*)sql withVAList: (va_list)args;
复制代码
查询

- (FMResultSet * _Nullable)executeQuery:(NSString*)sql, ...;
- (FMResultSet * _Nullable)executeQueryWithFormat:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error;
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary * _Nullable)arguments;
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withVAList:(va_list)args;
复制代码

方法解读:

1、如果需要插入基础数据类型,要么自己做一下转换,要么调用以下方法
- (FMResultSet * _Nullable)executeQueryWithFormat:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);

[_dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    [db open];
    [db executeUpdateWithFormat:@"INSERT INTO usertable VALUES (%d, %@ , %d)", 1, @"lizhiqiang", 25];
    [db close];
}];


2、这个没什么可说的,数组参数,直接上代码
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;

[_dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    [db open];
    [db executeUpdate:@"INSERT INTO usertable VALUES (?, ? , ?)" withArgumentsInArray:@[@2, @"yanghuixue", @26]];
    [db close];
}];


3、比方法2多了error指针参数,记录更新失败
- (BOOL)executeUpdate:(NSString*)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error;


4、注意,这个mark一下,参数为字典,写法变了,并且插入字段必须与字典key相对应
- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments;

NSDictionary *testDict = @{
                           @"id" : @14,
                           @"name" : @"ly",
                           @"age" : @15
                           };
[_dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    [db open];
    [db executeUpdate:@"INSERT INTO usertable VALUES(:id, :name, :age)" withParameterDictionary:testDict];
    [db close];
}];


5、va_list是 C语言 中解决变参问题的一组宏
- (BOOL)executeUpdate:(NSString*)sql withVAList: (va_list)args;
复制代码

批处理:可以通过调用 executeStatements 方法,一次执行多个 sql 语句

- (BOOL)executeStatements:(NSString *)sql;
- (BOOL)executeStatements:(NSString *)sql withResultBlock:(__attribute__((noescape)) FMDBExecuteStatementsCallbackBlock _Nullable)block;

例:
NSString *creatSqlString = @"CREATE TABLE IF NOT EXISTS grouptable(id INTEGER, gcid VARCHAR(64), gcname VARCHAR(64));"
@"CREATE TABLE IF NOT EXISTS usertable(id INTEGER, name VARCHAT(1024), age INTEGER)";

[_dataBaseQueue inDatabase:^(FMDatabase *db) {
    [db open];
    [db executeStatements:creatSqlString];
    [db close];
}];
复制代码

事务

事务( Transaction )是不可分割的一个整体操作,要么都执行,要么都不执行。

事务里有回滚操作,当一个整体事务在执行的时候,中间任何一个环节出现问题,则执行回滚,然后整个事务中的所有操作将无效。

FMDatabase 使用事务的方法:

笔记-FMDB

FMDatabaseQueue 使用事务的方法:

笔记-FMDB

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Eric Meyer on CSS

Eric Meyer on CSS

Eric Meyer / New Riders Press / 2002-7-8 / USD 55.00

There are several other books on the market that serve as in-depth technical guides or reference books for CSS. None, however, take a more hands-on approach and use practical examples to teach readers......一起来看看 《Eric Meyer on CSS》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具