iOS开发-------FMDB实现本地存储简易通讯录

来源:互联网 发布:生产线看板软件 编辑:程序博客网 时间:2024/06/05 08:25

      上一篇博客,用自带的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了,而是使用一个打包好的类

[objc] view plain copy
  1. @interface Sqlite3Manager ()  
  2.   
  3. @property(nonatomic,strong)FMDatabase * database;//第三方的数据库  
  4.   
  5. @property(nonatomic,strong)NSMutableArray * mHumen;  
  6.   
  7. @end  

再重写的init方法也变得简单

[objc] view plain copy
  1. - (instancetype)init  
  2. {  
  3.     self = [super init];  
  4.     if (self) {  
  5.           
  6.         //初始化数据数组  
  7.         self.mHumen = [NSMutableArray array];  
  8.           
  9.         //创建数据库  
  10.         [self createDatabase];  
  11.           
  12.         //打开数据库  
  13.         [self openDatabase];  
  14.           
  15.     }  
  16.     return self;  
  17. }  

单例方法与上次没有变

[objc] view plain copy
  1. +(instancetype)shareSqlite3Manager  
  2. {  
  3.     static Sqlite3Manager * sqliteManager = nil;  
  4.       
  5.     static dispatch_once_t onceToken;  
  6.     dispatch_once(&onceToken, ^{  
  7.           
  8.         sqliteManager = [[Sqlite3Manager alloc]init];  
  9.           
  10.     });  
  11.       
  12.     return sqliteManager;  
  13. }  

创建数据库的方法,相比直接用sqlite3_open也要简单明了,毕竟不用管C语言字符串与NSString的转换了

[objc] view plain copy
  1. /** 
  2.  *  创建数据库 
  3.  */  
  4. -(void)createDatabase  
  5. {  
  6.     //获得当前的沙盒路径  
  7.     NSString * path = [NSString stringWithFormat:@"%@/Documents/app.db",NSHomeDirectory()];  
  8.       
  9.     //根据路径初始化数据库  
  10.     self.database = [FMDatabase databaseWithPath:path];  
  11.   
  12. }  

接下来就是打开数据库了

[objc] view plain copy
  1. /** 
  2.  *  打开数据库 
  3.  */  
  4. -(void)openDatabase  
  5. {  
  6.     //如果打开成功  
  7.     if ([self.database open])  
  8.     {  
  9.         //初始化sql语句  
  10.         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))";  
  11.           
  12.         //执行操作  
  13.         if ([self.database executeUpdate:sql])//执行成功  
  14.         {  
  15.             NSLog(@"创建表成功");  
  16.         }  
  17.   
  18.         else  
  19.         {  
  20.             NSLog(@"创建失败!");  
  21.         }  
  22.           
  23.     }  
  24.       
  25.     else  
  26.     {  
  27.         NSLog(@"打开失败!");  
  28.     }  
  29.   
  30. }  

human的getter方法也是没有变的

[objc] view plain copy
  1. /** 
  2.  *  重写humen的get方法 
  3.  * 
  4.  *  @return 存储humen对象的数组 
  5.  */  
  6. -(NSArray *)humen  
  7. {  
  8.     return [NSArray arrayWithArray:self.mHumen];  
  9. }  


加载数据也不需要什么预编译语句,也不需要什么准备,单步查询

[objc] view plain copy
  1. /** 
  2.  *  加载所有的数据 
  3.  */  
  4. -(void)loadMHumen  
  5. {  
  6.     //删除所有的元素  
  7.     [self.mHumen removeAllObjects];  
  8.       
  9.     //定义SQL语句  
  10.     NSString * sql = @"select * from t_humen";  
  11.       
  12.     //获得数据  
  13.     FMResultSet * resultSet = [self.database executeQuery:sql];  
  14.       
  15.     //遍历处理  
  16.     while ([resultSet next])  
  17.     {  
  18.         //用字典接收  
  19.         NSDictionary * temp_dict = [resultSet resultDictionary];  
  20.           
  21.         //创建一个对象转模型  
  22.         Humen * humen = [[Humen alloc]initWithDict:temp_dict];  
  23.           
  24.         //添加到数组  
  25.         [self.mHumen addObject:humen];  
  26.           
  27.     }  
  28.       
  29. }  


增删改查的实现也不再有那么一大串,而是直接初始化好sql语句,通过NSString对象传入即可,只需调用对象 executeUpdate即可


[objc] view plain copy
  1. /** 
  2.  *  增加人 
  3.  * 
  4.  *  @param humen 需要增加的Humen模型 
  5.  */  
  6. -(void)addHumenToSqlite:(Humen *)humen  
  7. {  
  8.     //为数组添加元素对象  
  9.     [self.mHumen addObject:humen];  
  10.       
  11.     //设置sql语句  
  12.     NSString* sql = [NSString stringWithFormat:@"insert into t_humen values(NULL,'%@',%ld,'%@','%@')",humen.name,humen.age,humen.tele,humen.address];  
  13.       
  14.     //执行插入语句  
  15.     if ([self.database executeUpdate:sql])  
  16.     {  
  17.         NSLog(@"插入成功!");  
  18.     }  
  19.     else  
  20.     {  
  21.         NSLog(@"插入失败!");  
  22.     }  
  23. }  

[objc] view plain copy
  1. /** 
  2.  *  删除指定id的人对象 
  3.  * 
  4.  *  @param index 删除对象的id 
  5.  */  
  6. -(void)deleteHumenFromSqlite:(NSInteger)index  
  7. {  
  8.     //获取当前对象的id  
  9.     NSInteger ID = ((Humen *) self.mHumen[index - 1]).humenId;  
  10.       
  11.     //移除对象  
  12.     [self.mHumen removeObjectAtIndex:index - 1];  
  13.       
  14.     //设置sql语句  
  15.     NSString * sql = [NSString stringWithFormat:@"delete from t_humen where id=%ld",ID];  
  16.       
  17.     //执行语句  
  18.     if ([self.database executeUpdate:sql])  
  19.     {  
  20.         NSLog(@"删除成功!");  
  21.     }  
  22.     else  
  23.     {  
  24.         NSLog(@"删除失败!");  
  25.     }  
  26. }  

[objc] view plain copy
  1. /** 
  2.  *  更新数据 
  3.  * 
  4.  *  @param humen 需要更新的Humen模型 
  5.  */  
  6. -(void)updateHumenFromSqlite:(Humen *)humen withIndex:(NSInteger)index  
  7. {  
  8.     //获取当前的对象的ID  
  9.     NSInteger ID = ((Humen *)self.humen[index - 1]).humenId;  
  10.       
  11.     //数组替换  
  12.     [self.mHumen replaceObjectAtIndex:index - 1 withObject:humen];  
  13.       
  14.     //sql语句  
  15.     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];  
  16.       
  17.     if ([self.database executeUpdate:sql])  
  18.     {  
  19.         NSLog(@"更新成功!");  
  20.     }  
  21.     else  
  22.     {  
  23.         NSLog(@"更新失败!");  
  24.     }  
  25. }  

[objc] view plain copy
  1. /** 
  2.  *  根据姓名查询名字 
  3.  * 
  4.  *  @param name 查询的名字 
  5.  */  
  6. -(void)selectHumenFromWithName:(NSString *)name  
  7. {  
  8.     //可变数组存储符合条件的对象  
  9.     NSMutableArray * mutableHumen = [NSMutableArray array];  
  10.       
  11.     //只需在数组中查询即可,不需要在执行数据库  
  12.     for (Humen * humen in self.mHumen)  
  13.     {  
  14.         if ([humen.name isEqualToString:name])  
  15.         {  
  16.             //添加到数组  
  17.             [mutableHumen addObject:humen];  
  18.         }  
  19.     }  
  20.       
  21.     //改变当前的数组  
  22.     self.mHumen = mutableHumen;  
  23. }  

关闭数据库也是封装好的

[objc] view plain copy
  1. /** 
  2.  *  消除对象的时候关闭数据库 
  3.  */  
  4. -(void)dealloc  
  5. {  
  6.     //关闭数据库  
  7.     [self.database close];  
  8. }  

相比之下,代码少了非常多,简洁多了,用的时候绝对推荐插件,但是原理也不要忘记啊,功能一点也没有变化,和上一个中是一模一样。
原文链接:点击打开链接