引言
对于做iOS开发的人 FMDB 这个第三方我们是绝对不会陌生。
它大大的方便了我们对 数据库的操作。
今天就用一个简单的收藏功能介绍一下 使用FMDB第三方 来实现简单的增删改查这四个基础的功能操作方法。
首先这四个功能的基础语句在百度上是一抓一大把的
//user 代表 表名 你要取什么名自己替换掉
//user(括号内为数据库代码语句 名称 类型 不可为空 主键(设为主键则不可出现重复具有唯一性) ,有多个用逗号隔开) 。
//建表
[db executeUpdate:@"create table if not exists user(title text not null primary key)" ];
//增
[db executeUpdate:@"insert into user values(?)",title];
//删
[db executeUpdate:@"delete from user"];
//改
[db executeUpdate:@"update user set title = ? where title = ?",@"新的内容",@"旧的内容"];
//查
[db executeQueryWithFormat:@"select *from collect"];
实例情景
首先我需要存入的内容有:
1.title:内容名 为text类型 not null不允许为空 primary key给唯一性
2.responseObject:网络请求 JSONS 解析后的字典(使用了AFNetworking所以出来的直接是字典)类型为blob(存放归档类型)
3.image:图片 类型blob
基本上就够了
最开始我们需要创建一个 数据库的类
//.h
#import <Foundation/Foundation.h>
@interface DBManager : NSObject
@property (nonatomic, strong) FMDatabase *db;
//类方法使用即调用
+ (DBManager *)shareInsyance;
@end
//.m
#import "DBManager.h"
@implementation DBManager
//数据库需要在 程序的每个地方都不会被改变 所以我们需要写成单例
+ (DBManager *)shareInsyance{
static DBManager *db;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
db = [[DBManager alloc] init];
});
return db;
}
- (instancetype)init{
if ([super init]) {
//数据库路径
NSString *s = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//第一次调用则在此路径下创建program.sql文件 如果已存在直接使用
NSString *path = [s stringByAppendingString:@"/program.sql"];
self.db = [FMDatabase databaseWithPath:path];
NSLog(@"===================%@================",path);
}
return self;
}
@end
//写好后 我们在做一个数据库操作类
//为了解释得清楚些所以这回就不用model传值的方法介绍
//.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ProductDB : NSObject
//创建表格
- (void)createtable;
//添加数据
- (void)insertIntoTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image;
//查找数据
- (NSMutableArray *)selectFromTable:(NSString *)title;
//更新数据
- (void)updateTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image;
//删除
- (void)deleteTable:(NSString *)title;
@end
//.m
#import "ProductDB.h"
#import "DBManager.h"
@implementation ProductDB
//使用数据库时要注意 操作前打开[DBm.db open] 操作结束后一定要关闭[DBm.db close]
//创建表格 表名collect
- (void)createtable{
DBManager *dbM = [DBManager shareInsyance];
if ([dbM.db open]) {
[DBm.db executeUpdate:@"create table if not exists collect(title text not null primary key, responseObject blob, image blob)"];
}
[dbM.db close];
}
//添加数据
// 字典 和数组 用[NSKeyedArchiver archivedDataWithRootObject:进行归档] 图片用UIImageJPEGRepresentation(image, 1.0)
- (void)insertIntoTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image{
DBManager *dbM = [DBManager shareInsyance];
[dbM.db open];
[dbM.db executeUpdate:@"insert into collect values(?,?,?)",title,[NSKeyedArchiver archivedDataWithRootObject:responseObject],UIImageJPEGRepresentation(image, 1.0),];
[dbM.db close];
}
//查找数据
- (NSMutableArray *)selectFromTable:(NSString *)title{
NSMutableArray *array = [NSMutableArray array];
DBManager *dbM = [DBManager shareInsyance];
[dbM.db open];
//查找是没有条件则把表中所有东西查找
FMResultSet *set = [dbM.db executeQueryWithFormat:@"select *from collect where title = %@;",title];
while ([set next]) {
NSString *s = [set stringForColumn:@"title"];
//反归档字典
NSData *dataR = [set dataForColumn:@"responseObject"];
NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithData:dataR];
//反归档图片
NSData *dataC = [set dataForColumn:@"image"];
UIImage *image = [UIImage imageWithData:dataC];
//保证image 不在空状态 空图片不能放入数组 避免无数据时崩溃 placeholder.png 为占位图
if (image == nil) {
image = [UIImage imageNamed:@"placeholder"];
}
[array addObject:s];
[array addObject:dic];
[array addObject:image];
[array addObject:arr];
}
[dbM.db close];
return array;
}
//更新数据
- (void)updateTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image{
DBManager *dbM = [DBManager shareInsyance];
if ([dbM.db open]) {
//update collect set 更改数据 = ? where 对应条件 = ?
[dbM executeUpdate:@"update collect set responseObject = ?, image = ? where title = ?",[NSKeyedArchiver archivedDataWithRootObject:responseObject],UIImageJPEGRepresentation(image, 1.0),,title];
}
[dbM close];
}
//删除
- (void)deleteTable:(NSString *)title{
//1.全部删除 需要全部删除的吧下边拖出去弄成一个方法
DBManager *dbM = [DBManager shareInsyance];
if ([dbM.db open]) {
[dbM.db executeUpdate:@"delete from collect"];
}
[dbM.db close];
//2.对应删除
DBManager *dbM = [DBManager shareInsyance];
if ([dbM.db open]) {
[dbM.db executeUpdate:@"delete from collec where title = ?",title];
}
[dbM.db close];
}
@end
弄完后就可以开始使用了
1.数据添加
//第一步建表
[[[ProductDB alloc] init] createtable];
//第二步添加数据 因为设定title一定不能为空 (要在数据加载完全后再添加 如果提前添加 会有两种情况 title 为空 崩溃 除title以外为空 在数据库里会显示nill (可以在加载完后使用更新 进行更改 --> 直接在加载完的地方添加不就好了 MDZZ =- = 所以说收藏里更新没啥用))
[[[ProductDB alloc] init] insertIntoTable:title responseObject:responseObject image:image];
//一般收藏用不到更新··
[[[ProductDB alloc] init] updateTable:title responseObject:responseObject image:image];
2.内容展示
//取出数据 (查找)
self.Array = [[[ProductDB alloc] init] selectAllTable];
//为什么跟上面不同呢=- = 因为既然是展示就需要取出所有内容 所以在原来的基础上 每组数据用数组装好 再装到传出来的数组里 这样就可以拿到全部内容了
/*
NSMutableArray *item = [NSMutableArray array];
[item addObject:s];
[item addObject:dic];
[item addObject:image];
[array addObject:item];
*/
3.删除内容 (内部实现的差别上面提过了)
//删除单个内容
[[[ProductDB alloc] init] deleteTable:title];
//删除全部内容
[[[ProductDB alloc] init] deleteTable];
到这里收藏的基本功能就都完成了,相对于别的数据库操作 iOS 上的已经算很简单的了。 网上这方面的介绍也蛮多的,我也是闲着没事写一个使用实例给刚接触的新司机朋友提提速,希望需要的朋友能看得明白。
2016 年 8 月20 日 随笔······