上一篇博客,用自带的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])
- {
-
- 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方法也是没有变的
-
-
-
-
-
- -(NSArray *)humen
- {
- return [NSArray arrayWithArray:self.mHumen];
- }
加载数据也不需要什么预编译语句,也不需要什么准备,单步查询
-
-
-
- -(void)loadMHumen
- {
-
- [self.mHumen removeAllObjects];
-
-
- 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即可
-
-
-
-
-
- -(void)addHumenToSqlite:(Humen *)humen
- {
-
- [self.mHumen addObject:humen];
-
-
- 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(@"插入失败!");
- }
- }
-
-
-
-
-
- -(void)deleteHumenFromSqlite:(NSInteger)index
- {
-
- NSInteger ID = ((Humen *) self.mHumen[index - 1]).humenId;
-
-
- [self.mHumen removeObjectAtIndex:index - 1];
-
-
- NSString * sql = [NSString stringWithFormat:@"delete from t_humen where id=%ld",ID];
-
-
- if ([self.database executeUpdate:sql])
- {
- NSLog(@"删除成功!");
- }
- else
- {
- NSLog(@"删除失败!");
- }
- }
-
-
-
-
-
- -(void)updateHumenFromSqlite:(Humen *)humen withIndex:(NSInteger)index
- {
-
- NSInteger ID = ((Humen *)self.humen[index - 1]).humenId;
-
-
- [self.mHumen replaceObjectAtIndex:index - 1 withObject:humen];
-
-
- 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(@"更新失败!");
- }
- }
-
-
-
-
-
- -(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];
- }
相比之下,代码少了非常多,简洁多了,用的时候绝对推荐插件,但是原理也不要忘记啊,功能一点也没有变化,和上一个中是一模一样。