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

      上一篇博客,用自带的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];
}

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值