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

通讯录(数据结构) #include #include #include /*定义双链表作为通讯信息的物理存储结构*/ struct TXL{     char name[30];     char street[100];     char city[30];     char state[30];     char num[11];     struct TXL *next; 阅读详情

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

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

高效iOS通讯录管理:FMDB解决方案详解 本文还有配套的精品资源,点击获取 简介:本项目【fmdb通讯录】为iOS开发提供了一套高效管理通讯录数据的解决方案。采用SQLite数据库和Facebook开发的FMDB开源库,实现轻量级封装,简化SQL语句的执行过程。项目涵盖创建数据库表、执行CRUD操作,并与系统通讯录框架兼容。此外,通过CocoaPods管理项目依赖,确保项目的高效集成和运行。开发者将学习到如何利用F... 阅读详情

相关推荐

使用FMDB保存聊天记录

使用FMDB保存聊天记录到本地Documents的工具类,可以参考看看

IOS 基于SQL实现可以保存聊天记录的功能实现

IOS 基于SQL实现可以保存聊天记录的功能实现 由于公司要在app中实现聊天功能,在花了一段时间了解实现该功能后发现网上的资料大多只实现了聊天对话,互发图片,录音等等,找了好久都没有发现一个自带存储聊天记录的资料,于是我在简单的用SQL实现了存储功能后在此分享一下,希望对有需要的童鞋有帮助 使用FMDB框架封装 首先打开数据库,没有的话新建一个 -(id)initWithIdf:(int)i...

weixin_34247155的博客 621

iOS通讯录联系人列表较完整(中文排序)

简单实现iOS通讯录联系人列表,欢迎大家互相学习。

iOS中FMDB的使用

在iOS开发中,如果本地需要做大量的缓存,FMDB用的是比较多的,怎么集成到项目中我这里就不说了,主要说一下FMDB使用的一个思路和自己遇到的坑。 在我自己开发聊天系统的时候,我一般是用FMDB用来缓存最近联系人列表和用户的聊天消息列表。因为聊天系统,涉及到的读和写比较频繁,所以我会封装一个单例类用来处理每个部分的数据存储和读写。 下面是用来管理最近联系人缓存的功能实现,其余的模块也可以按照这样的...

浅浅的博客 3052

ios-电话通讯录-Demo.zip

获取通讯录里的用户,并进行排序

fmdb通讯录

封装的数据管理 通讯录 用CocoaPods管理 切记打开AddressBook.xcworkspace 运行项目

FMDB常用的数据类型以及sql语句

SQLite数据库的基本数据类型: 整数数据类型: (1)integer :整形数据,大小为4个字节 (2)bigint : 整形数据,大小为8个字节 (3)smallint:整形数据,大小为2个字节 (4)tinyint:从0到255的整形数据,存储大小为1字节 浮点数数据类型: (1)float:4字节浮点数 (2)double: 8字节浮点

ciwei_numberOne的博客 6693

iOS简单通讯录的实现

本代码使用tableView 和 navgationController 简单实现了通讯录, 可以增删改移, 实现了男女联系人不用的cell, 缺陷,不能添加联系人的头像 希望会使用PHAsset 的大神可以私信教教我.

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

最近几天整了下Sqlite3,也就是ios的另外一种储存方式,那么coreData是有什么不足么,不是,一般数据比较简易的时候是不会用coreData的,反而会用自身的sqlte3来实现本地的存储,这就需要用到了点SQL语句了,一般都会用第三方FMDB(第三方库)来简化使用,但第三方的应用是下一次博客的事情了,这次用自带的sqlite3来实现一个简易的通讯录,能够实现保存,并完成增删改查即可,毕竟

RITL_Y 3104

iosFMDB开发的通讯录

ios开发,用FMDB数据库开发的一个手机通讯录,支持查询,滑动删除等。

ios-简单的使用FMDB存储数据.zip

简单的使用FMDB对数据库进行读取修改删除 后续还会补充 SQL参考http://www.jianshu.com/p/143c83362909

关于iOS GYDataCenter本地数据库解决方案的那些事儿--上卷

上一篇,讲到前端处理数据线程的解决方案,这里有需要到数据的本地存储,数据持久最好的方式首选数据库。那现在在我们的面前的有两种选择,一种是apple的coredata,另外一种就是采用FMDB。我的主观反应是,我首推的是FMDB,FMDB的灵活性能更强,适用于多种场景,在数据处理上,可以通过选择不同的SQL语句,达到更好的效果。在FMDB的基础上,还有一个更便利的框架--GYDataCenter。

Avalanching博客 1166

芯片设计新手必看:5分钟搞懂工艺角(Process Corner)到底是什么,为啥仿真总要用它?

本文详细解析了芯片设计中的工艺角(Process Corner)概念及其在仿真中的重要性。通过类比马拉松运动员的性能差异,解释了晶体管制造过程中的天然波动,并介绍了TT/FF/SS等工艺角代码的含义。文章还探讨了为何需要跑全工艺角仿真,以及现代芯片验证的完整流程,包括PVT矩阵和多模式分析(MMMC),帮助芯片设计新手快速掌握这一关键概念。

weixin_28713947的博客 246

ios 融云 重写对话列表_GitHub - sealtalk/sealtalk-ios: iOS App of SealTalk powered by RongCloud. 基于融云开发的 iOS ...

SealTalk-iOSiOS App of SealTalk powered by RongCloud.基于融云 IM SDK 应用程序 - 嗨豹。运行 SealTalk-iOSSealTalk 从 2.0.0 版本开始改用 cocoaPods 管理融云 SDK 库和其他第三方库,下载完源码后,按照下面步骤操作1.终端进入 Podfile 目录2.更新本地 CocoaPods 的本地仓库,终端执...

weixin_33274667的博客 286

保姆级教程:Unity编辑器汉化全流程(从下载到配置避坑指南)

本文提供Unity编辑器汉化的保姆级教程,涵盖从下载中文语言包到配置避坑的全流程。详细解析版本适配、文件系统交互及编辑器底层配置逻辑,帮助开发者高效完成汉化,解决常见报错问题,提升工作效率。

weixin_30825581的博客 155

【HDR】曝光融合(Exposure Fusion)

在曝光融合(Exposure Fusion)算法问世之前,多曝光序列合成用于显示的HDR需要两个步骤,第一步是将多张不同曝光的低动态范围图像合成为HDR(例如Debevec提出的加权融合方法),通常HDR为12bit或者16bit;第二步是通过tonemapping对高动态范围HDR进行压缩以支持低动态范围显示设备(例如Durand提出的基于双边滤波的tonemapping算法),一般会压缩至8bit。

专注人工智能,主攻CV 1万+

FMDB存储聊天记录 (plist存储最后一组对话数据)

https://blog.youkuaiyun.com/aaaaazq/article/details/83961538 https://www.cnblogs.com/machealking/articles/4644622.html

niejinhao052011的专栏 795

import-im6.q16: attempt to perform an operation not allowed by the security policy `PS‘ @ error/cons

这六个 policy 是使用 XML 格式描述的安全策略。要将其中的限制注释掉,在每个 policy 开始和结束的标记之间添加注释标记“

m0_60657960的博客 1909

iOS开发 缓存本地数据

芷江的博客 967

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 1万+

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3213

iOS 获取系统通讯录的两种方法

今天看了很多获取通讯录的博客,大体就是分两大种、四小种,两大种分别是基于address框架和contacts框架开发的,四小种就是这两大种分别的有UI和无UI。 但是address框架在iOS9之后就被弃用了,虽然还可以用,但是毕竟掌握新技术才是正道。下面我就把这几种的代码贴上来,供大家参考。一、使用AddressBook.framework框架 包含框架 #import <AddressB

操作猛如虎的博客 5097

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 780

数据缓存——FMDB的使用

FMDB的使用   https://github.com/ccgus/fmdb   FMDB是iOS平台的建立在SQLite数据库框架,以objective-c的方式封装了SQLite的C语言API。 FMDB使用时更加面向对象,省去了很多麻烦、冗余的C语言代码;提供了多线程安全的数据库操作方法。   FMDB有三个主要的类 1、FMDatabase:表示一个单独的SQLite数据

番薯大佬的专栏 1618

YOLOv8_obb训练流程-原理解析[旋转目标检测理论篇]

本文主要介绍了YOLOv8旋转目标检测的流程,介绍了标签的解码、预测结果的解码,以及如何理解旋转角度等内容,还介绍旋转目标检测框的正样本选取及Loss计算。

ice 4732

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: iOS开发-------Sqlite3实现本地存储简易通讯录
下一篇: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure 解决
RITL
博客等级 码龄11年 69粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值