本文的适用人群
限于本人自身水平,这篇文章非常的基础,但我会尽量说的非常详细,因为网上的文章大部分只是讲解一下有这个方法,具体怎么用并不是非常的详尽,所以本文不求花式用FMDB,详尽为主,大神们可以直接不用往下看了,怕被喷的体无完肤。。。
写这篇简书的目的
近来项目不是很紧,于是乎就想起来了好久不用的FMDB。为什么好久不用了呢,反正我写的项目几乎都没用到数据库,轻量级的存储用NSUserDefaults足够了,话说在这个网络发达的时代数据一般都是存在后台数据库的吧,毕竟手机更新换代速度贼快,数据存在自己手机里下次登录都没了岂不尴尬,哈哈,废话不多说,上干货~
FMDB的基本介绍
FMDB 头文件,使用之前必须先导入。
FMDatabase 数据库操作类,生成单例数据库操作对象
FMResultSet 数据结果集类,所有往数据库中插入的信息都可以在这个类中查询到
下面正式开始FMDB的使用
1.首先我们一般是要创建一个操作数据库的单例类,这个大家都会,但我还是贴出来吧
+(DataBaseTool *)shareDatabase
{
static DataBaseTool * manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[DataBaseTool alloc]init];
});
return manager;
}
2.为了方便数据库的使用和避免性能的消耗,我们在init方法中指定创建表的路径,我这里放在了documents下,然后在这里创建好了所需要用的表,这样当我们初始化工具类对象之后表就已经创建好了没我们可以直接进行对数据库的增删改查的操作。代码如下:
-(instancetype) init{
if (self = [super init]) {
//获取doucuments的路径
NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
//获取database路径
NSString *databasePath = [documentsURL URLByAppendingPathComponent:@"pinMoeny"].path;
NSLog(@"databaseURL == %@",databasePath);
if (![[NSFileManager defaultManager] fileExistsAtPath:databasePath]) {
//如果不存在表就创建一个表
BOOL result = [[NSFileManager defaultManager] createFileAtPath:databasePath contents:nil attributes:nil];
if (result) {
NSLog(@"数据库文件创建结果-->数据库文件创建成功");
}else{
NSLog(@"数据库文件创建结果-->数据库文件创建失败");
}
}
//创建数据库对象
_DB = [[FMDatabase alloc]initWithPath:databasePath];
//操作前先打开,执行后关闭
[_DB open];
//没有表先创建一个表
//这里是一个记录时间和内容的SQL,如何需要其他类型的参数请自行定义。我这里就不多做表述了。
NSString *sqlStr = @"CREATE TABLE IF NOT EXISTS LQCountAndDate ('CountStr' countStr,'DateStr' dateStr,id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)";
BOOL result = [_DB executeUpdate:sqlStr];
if (result) {
NSLog(@"表创建结果-->表创建成功");
}else{
NSLog(@"表创建结果-->表创建失败");
}
//如果需要创建其他的表,同上一个表的创建方法,这下边再创建自己需要的表。
//这是一个记录时间内容和image的SQL语句
NSString* SQL = @"CREATE TABLE IF NOT EXISTS ZYDraft ('Text' text,'Date' date,Image binary,id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)";
BOOL result = [_DB executeUpdate:SQL];
if (result) {
NSLog(@"创建成功");
}else {
NSLog(@"创建失败");
}
//数据库操作完毕之后关闭数据库(否则会造成内存消耗)
[_DB close];
}
return self;
}
3.创建好了数据库对象接下来就是使用这个对象对数据库进行增删改查的操作了,我们主要用的数据库对象方法有两个(1)executeQuery负责对数据库的查询操作。(2)executeUpdate负责对数据库的增删改操作。下面具体实现一下数据库的插入或者删除操作,首先我们插入一条数据到表中,代码如下
-(void)insertText:(NSString* )text image:(UIImage* )image {
//首先打开数据库
[_DB open];
//写自己需要的插入SQL语句,这里是一个包括文字,时间,和image的SQL语句
NSString* SQL = @"INSERT INTO ZYDraft (Text, Date, Image) VALUES (?, ?, ?)";
//因为我这里的时间是插入时的时间,所以直接去了当前时间
NSDate* date = [NSDate date];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM-dd HH:mm"];
NSString* dateString = [dateFormatter stringFromDate:date];
//这里image是作为二进制类型存入的
NSData* imageData = UIImagePNGRepresentation(image);
BOOL result = [_DB executeUpdate:SQL, text, dateString, imageData ? imageData : @""];
if (result) {
NSLog(@"插入成功");
}else {
NSLog(@"插入失败");
}
//数据库操作完毕之后关闭数据库
[_DB close];
}
4.上边是插入一条数据,这里给大家写一下查询一张表中所有的数据,代码如下:
-(NSArray* )selectAllDrafts {
//操作前打开数据库
[_database open];
//ORDER BY 指定按那一列排序,默认是升序。
NSString* SQL = @"SELECT * FROM ZYDraft ORDER BY id DESC";
//executeQuery,查询。
//executeUpdate,增删改。
//查询结果是结果集。
FMResultSet* set = [_database executeQuery:SQL];
NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:0];
//使用 while 循环遍历,取出每一个数据。
//set.next,判断是否还有下一组数据。
while (set.next) {
//通过列名取。
NSString* text = [set stringForColumn:@"Text"];
//通过列索引取。
NSString* date = [set stringForColumnIndex:1];
NSData* imageData = [set dataForColumnIndex:2];
//封装到 model 类中
ZYDraft* draft = [[ZYDraft alloc] init];
draft.text = text;
draft.date = date;
if (imageData) {
//在这里将data类型image转化成UIImage类型
draft.image = [[UIImage alloc] initWithData:imageData];
}
[result addObject:draft];
}
//操作完毕之后关闭数据库
[_database close];
return result;
}
6.说完了插入数据和查询数据,删除数据也是必须的,不多说,代码如下:
//删除一条数据记录
-(void)deleteMessageWithId:(NSString *)aId{
//这里解释一下这个id,如果你是在服务器请求的数据有自己的id,那么存数据的时候存一下该条数据的id,这里的aId就是你存的id。
//我这里不是从网络上获取的数据,但又一个自增的id,这个自增的id也具有唯一性,我这里用的就是这个自增的id。
//首先打开数据库
[_DB open];
//删除数据的SQL语句
NSString* SQL = @"DELETE FROM LQCountAndDate WHERE id = ?";
//执行删除的结果
BOOL result = [_DB executeUpdate:SQL,aId];
if (result) {
NSLog(@"删除结果-->删除一条数据成功");
}else{
NSLog(@"删除结果-->删除一条数据失败");
}
//关闭数据库
[_DB close];
}
网友评论