一.FMDB介绍
FMDB同时兼容 ARC 和非 ARC 工程,会自动根据工程配置来调整相关的内存管理代码
二.FMDB类介绍
1.FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句
2.FMResultSet:用在FMDatabase中执行查询的结果的类
3.FMDatabaseQueue:在多线程下查询和更新数据库用到的类,它是线程安全的
三.FMDB操作
1.数据库创建:
创建数据库只需要一行代码即可,当改文件不存在时,FMDatabase会自己创建
1.一个系统路劲.磁盘中可以不存在此文件,如果不存在会自动创建
2.一个空的字符串 @"".会在临时位置创建一个空的数据库,当FMDatabase连接关闭时,该数据库会被删除
3.NULL.会在内存中创建一个数据库,当 FMDatabase 连接关闭时,该数据库会被销毁
//获得存放数据库文件的沙盒地址
+ (NSString *)databaseFilePath
{
NSArray *filePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [filePath objectAtIndex:0];
NSString *dbFilePath = [documentPath stringByAppendingPathComponent:@"person.db"];
return dbFilePath;
}
//创建数据库
+ (void)creatDatabase
{
fmdb = [FMDatabase databaseWithPath:[self databaseFilePath]];
//为数据库设置缓存,提高查询效率
[fmdb setShouldCacheStatements:YES];
}
2.数据库打开:
数据库必须是打开状态,才能与之交互.如果没有足够的资源和权限来打开\创建数据库,数据库会打开失败.通常打开完操作操作后,需要调用close方法来关闭数据库
if (![fmdb open]) {
// error
return;
}
// some operation
// ...
[fmdb close];
3.创建表:
//创建表
+ (void)creatTable
{
//先判断数据库是否存在,如果不存在,创建数据库
if (!fmdb) {
[self creatDatabase];
}
//判断数据库是否已经打开,如果没有打开,提示失败
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return;
}
//为数据库设置缓存,提高查询效率
[fmdb setShouldCacheStatements:YES];
//判断数据库中是否已经存在这个表,如果不存在则创建该表
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
// SQLite将数据划分为以下几种存储类型:
// 1.integer : 整型值
// 2.real : 浮点值
// 3.text : 文本字符串
// 4.blob : 二进制数据(比如文件)
[fmdb executeUpdate:@"CREATE TABLE IF NOT EXISTS PERSON_FMDB_CACHE(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, PERSON_ID INTEGER, PERSON_NAME TEXT, PERSON_AGE INTEGER, PERSON_SEX TEXT, PERSON_HEIGHT TEXT)"];
NSLog(@"创建完成");
}
// 添加字段
if (![fmdb columnExists:@"PERSON_BIR" inTableWithName:@"PERSON_FMDB_CACHE"]) {
[fmdb executeUpdate:@"ALTER TABLE PERSON_FMDB_CACHE ADD PERSON_BIR VARCHAR(30)"];
}
}
4.删除表:
//删除表
+ (void)dropTable
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
[fmdb executeUpdate:@"DROP TABLE IF EXISTS PERSON_FMDB_CACHE"];
[fmdb close];
}
5.数据库添加数据(增):
#pragma mark - 增
+ (BOOL)insertData:(Person *)person
{
return [WLFMDB insertDatas:@[person]];
}
+ (BOOL)insertDatas:(NSArray<Person *> *)persons
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return NO;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
for (Person *person in persons) {
//现在表中查询有没有相同的元素,如果有,做修改操作
FMResultSet *res = [fmdb executeQuery:@"SELECT * FROM PERSON_FMDB_CACHE WHERE PERSON_ID = ?",@(person.pId).stringValue];
if (![res next]) {
//向数据库中插入一条数据
[fmdb executeUpdate:@"INSERT INTO PERSON_FMDB_CACHE (PERSON_ID, PERSON_NAME, PERSON_AGE, PERSON_SEX, PERSON_HEIGHT) VALUES (?, ?, ?, ?, ?)",@(person.pId).stringValue, person.name, @(person.age).stringValue, person.sex, @(person.height)];
} else {
//修改操作
[fmdb executeUpdate:@"UPDATE PERSON_FMDB_CACHE SET PERSON_NAME = ?, PERSON_AGE = ?, PERSON_SEX = ?, PERSON_HEIGHT = ? WHERE PERSON_ID = ?", person.name, @(person.age), person.sex, @(person.height), @(person.pId)];
}
}
[fmdb close];
return YES;
}
6.数据库删除数据(删):
#pragma mark - 删
+ (BOOL)deleteDataWithId:(NSInteger)pId
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return NO;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
[fmdb executeUpdate:@"DELETE FROM PERSON_FMDB_CACHE WHERE PERSON_ID = ?",@(pId)];
[fmdb close];
return NO;
}
+ (BOOL)deleteAllData
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return NO;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
[fmdb executeUpdate:@"DELETE FROM PERSON_FMDB_CACHE"];
[fmdb close];
return YES;
}
7.数据库改数据(改):
#pragma mark - 改
+ (BOOL)updateDataName:(NSString *)aName byID:(NSInteger)aID
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return NO;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
[fmdb executeUpdate:@"UPDATE PERSON_FMDB_CACHE SET PERSON_NAME = ? WHERE PERSON_ID = ?", aName, @(aID)];
[fmdb close];
return YES;
}
+ (BOOL)updateData:(Person *)person
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return NO;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
[fmdb executeUpdate:@"UPDATE PERSON_FMDB_CACHE SET PERSON_NAME = ?, PERSON_AGE = ?, PERSON_SEX = ?, PERSON_HEIGHT = ? WHERE PERSON_ID = ?", person.name, @(person.age), person.sex, @(person.height), @(person.pId)];
return YES;
}
8.数据库查数据(查):
#pragma mark - 查
+ (NSMutableArray<Person *> *)getDataWithId:(NSInteger)pId
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return nil;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
FMResultSet *results = [fmdb executeQuery:@"SELECT * FROM PERSON_FMDB_CACHE WHERE PERSON_ID = ?", @(pId)];
NSMutableArray<Person *> *persons = [[NSMutableArray alloc] init];
while ([results next]) {
Person *person = [[Person alloc] init];
person.pId = [results intForColumn:@"PERSON_ID"];
person.name = [results stringForColumn:@"PERSON_NAME"];
person.age = [results intForColumn:@"PERSON_AGE"];
person.sex = [results stringForColumn:@"PERSON_SEX"];
person.height = [results doubleForColumn:@"PERSON_HEIGHT"];
[persons addObject:person];
}
[results close];
[fmdb close];
return persons;
}
+ (NSMutableArray<Person *> *)getAllData
{
if (!fmdb) {
[self creatDatabase];
}
if (![fmdb open]) {
NSLog(@"数据库打开失败");
return nil;
}
if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
[self creatTable];
}
FMResultSet *results = [fmdb executeQuery:@"SELECT * FROM PERSON_FMDB_CACHE"];
NSMutableArray<Person *> *persons = [[NSMutableArray alloc] init];
while ([results next]) {
Person *person = [[Person alloc] init];
person.pId = [results intForColumn:@"PERSON_ID"];
person.name = [results stringForColumn:@"PERSON_NAME"];
person.age = [results intForColumn:@"PERSON_AGE"];
person.sex = [results stringForColumn:@"PERSON_SEX"];
person.height = [results doubleForColumn:@"PERSON_HEIGHT"];
[persons addObject:person];
}
[results close];
[fmdb close];
return persons;
}