上一篇博客,用自带的sqlite3实现了简易的通讯录,那么实现本地存储,除了coreData以及sqlite3,也看出用sqlite3来实现是比较麻烦的,特别是需要注意NSString以及C语言的字符串的转换问题,那么FMDB就完全解决了这个问题,其实FMDB是基于sqlite3来封装的一个类,让使用起来更加直观,因为这个一篇是基于上一篇的,所以感兴趣可以去上一篇iOS学习-------Sqlite3实现本地存储简易通讯录瞅一瞅,下面是这个包里面的类预览
基于上一篇博客的内容,只需修改Sqlite3Manager即可,但是同样需要导入sqlite3的包,如何导入也可以去上一篇瞅瞅,因为说过,FMDB是基于sqlite3来实现哪些功能的,如果打开实现文件来看,是和上一篇中的某些代码用法一样的,话不都说,这里只介绍改后的Sqlite3Manager即可,修改完毕之后无需改动其他的类,依旧能够实现所有的功能
如果觉得页面非常简单,也非常欢迎去之前的博客 iOS学习-------简单通讯录(UITableView和CoreData的应用) ,里面用的是coreData,其实一样的
首先需要导入一个头文件
#import "FMDatabase.h"
接着在延展中不再需要Sqliet3 * humenData了,而是使用一个打包好的类
@interface Sqlite3Manager ()
@property(nonatomic,strong)FMDatabase * database;//第三方的数据库
@property(nonatomic,strong)NSMutableArray * mHumen;
@end
再重写的init方法也变得简单
- (instancetype)init
{
self = [super init];
if (self) {
//初始化数据数组
self.mHumen = [NSMutableArray array];
//创建数据库
[self createDatabase];
//打开数据库
[self openDatabase];
}
return self;
}
单例方法与上次没有变
+(instancetype)shareSqlite3Manager
{
static Sqlite3Manager * sqliteManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sqliteManager = [[Sqlite3Manager alloc]init];
});
return sqliteManager;
}
创建数据库的方法,相比直接用sqlite3_open也要简单明了,毕竟不用管C语言字符串与NSString的转换了
/**
* 创建数据库
*/
-(void)createDatabase
{
//获得当前的沙盒路径
NSString * path = [NSString stringWithFormat:@"%@/Documents/app.db",NSHomeDirectory()];
//根据路径初始化数据库
self.database = [FMDatabase databaseWithPath:path];
}
接下来就是打开数据库了
/**
* 打开数据库
*/
-(void)openDatabase
{
//如果打开成功
if ([self.database open])
{
//初始化sql语句
NSString * sql = @"create table if not exists t_humen (id integer primary key autoincrement,name varchar(30),age integer,tele varchar(100),address varchar(100))";
//执行操作
if ([self.database executeUpdate:sql])//执行成功
{
NSLog(@"创建表成功");
}
else
{
NSLog(@"创建失败!");
}
}
else
{
NSLog(@"打开失败!");
}
}
human的getter方法也是没有变的
/**
* 重写humen的get方法
*
* @return 存储humen对象的数组
*/
-(NSArray *)humen
{
return [NSArray arrayWithArray:self.mHumen];
}
加载数据也不需要什么预编译语句,也不需要什么准备,单步查询
/**
* 加载所有的数据
*/
-(void)loadMHumen
{
//删除所有的元素
[self.mHumen removeAllObjects];
//定义SQL语句
NSString * sql = @"select * from t_humen";
//获得数据
FMResultSet * resultSet = [self.database executeQuery:sql];
//遍历处理
while ([resultSet next])
{
//用字典接收
NSDictionary * temp_dict = [resultSet resultDictionary];
//创建一个对象转模型
Humen * humen = [[Humen alloc]initWithDict:temp_dict];
//添加到数组
[self.mHumen addObject:humen];
}
}
增删改查的实现也不再有那么一大串,而是直接初始化好sql语句,通过NSString对象传入即可,只需调用对象 executeUpdate即可
/**
* 增加人
*
* @param humen 需要增加的Humen模型
*/
-(void)addHumenToSqlite:(Humen *)humen
{
//为数组添加元素对象
[self.mHumen addObject:humen];
//设置sql语句
NSString* sql = [NSString stringWithFormat:@"insert into t_humen values(NULL,'%@',%ld,'%@','%@')",humen.name,humen.age,humen.tele,humen.address];
//执行插入语句
if ([self.database executeUpdate:sql])
{
NSLog(@"插入成功!");
}
else
{
NSLog(@"插入失败!");
}
}
/**
* 删除指定id的人对象
*
* @param index 删除对象的id
*/
-(void)deleteHumenFromSqlite:(NSInteger)index
{
//获取当前对象的id
NSInteger ID = ((Humen *) self.mHumen[index - 1]).humenId;
//移除对象
[self.mHumen removeObjectAtIndex:index - 1];
//设置sql语句
NSString * sql = [NSString stringWithFormat:@"delete from t_humen where id=%ld",ID];
//执行语句
if ([self.database executeUpdate:sql])
{
NSLog(@"删除成功!");
}
else
{
NSLog(@"删除失败!");
}
}
/**
* 更新数据
*
* @param humen 需要更新的Humen模型
*/
-(void)updateHumenFromSqlite:(Humen *)humen withIndex:(NSInteger)index
{
//获取当前的对象的ID
NSInteger ID = ((Humen *)self.humen[index - 1]).humenId;
//数组替换
[self.mHumen replaceObjectAtIndex:index - 1 withObject:humen];
//sql语句
NSString * sql = [NSString stringWithFormat:@"update t_humen set name='%@',age=%ld,tele='%@',address='%@' where id=%ld",humen.name,humen.age,humen.tele,humen.address,ID];
if ([self.database executeUpdate:sql])
{
NSLog(@"更新成功!");
}
else
{
NSLog(@"更新失败!");
}
}
/**
* 根据姓名查询名字
*
* @param name 查询的名字
*/
-(void)selectHumenFromWithName:(NSString *)name
{
//可变数组存储符合条件的对象
NSMutableArray * mutableHumen = [NSMutableArray array];
//只需在数组中查询即可,不需要在执行数据库
for (Humen * humen in self.mHumen)
{
if ([humen.name isEqualToString:name])
{
//添加到数组
[mutableHumen addObject:humen];
}
}
//改变当前的数组
self.mHumen = mutableHumen;
}
关闭数据库也是封装好的
/**
* 消除对象的时候关闭数据库
*/
-(void)dealloc
{
//关闭数据库
[self.database close];
}
相比之下,代码少了非常多,简洁多了,用的时候绝对推荐插件,但是原理也不要忘记啊,功能一点也没有变化,和上一个中是一模一样。