iOS开发通过微信学习WCDB(三)

article/2025/10/9 10:09:47

  通过之前的两篇文章对wcdb能够简单的使用了,这些知识储备多时,最近终于可以派上用场了,最近app有一个通讯录的新功能,实现联系人列表的排序,以及检索,刚好可以用用wcdb去实现。

联系人模型的建立

  我首先建立了联系人的模型,具体代码如下:

@interface YWContactModel : NSObject@property (nonatomic,assign) NSInteger uid;             ///< 用户id
@property (nonatomic,copy) NSString *nickname;          ///< 用户昵称
@property (nonatomic,copy) NSString *avatar;            ///< 用户头像
@property (nonatomic,copy) NSString *pinyin;            ///< 昵称的拼音
@property (nonatomic,assign) NSInteger ownerCount;      ///< 拥有者数量@end

由于考虑到可能有多个用户在同一个手机上使用的可能,我这边新建了一个表,联系人关系表。具体代码如下:

@interface YWContactRelationModel : NSObject@property(nonatomic, assign) NSInteger ownerUid;  ///< 用户的uid
@property(nonatomic, assign) NSInteger uid;       ///< 通讯录中朋友的uid@end

大家可能已经注意到了,ownerCount这个字段,由于一个用户可能有多个朋友,那么他可能是好多人通讯录列表中的联系人,这个 字段主要是为了方便对本地保存的联系人删除管理。
另外由于要用到多表查询,因此需要用到联合主键。这里我在YWContactRelationModel.mm文件中实现如下:

@implementation YWContactRelationModel+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper{return @{@"uid":@"id"};
}- (NSInteger)ownerUid{if (!_ownerUid) {_ownerUid = [YWAccountManager sharedManager].account.user.uid;}return _ownerUid;
}
WCDB_IMPLEMENTATION(YWContactRelationModel)
WCDB_SYNTHESIZE(YWContactRelationModel, ownerUid)
WCDB_SYNTHESIZE(YWContactRelationModel, uid)WCDB_MULTI_PRIMARY_ASC(YWContactRelationModel, "relation", ownerUid)//设置联合主键
WCDB_MULTI_PRIMARY(YWContactRelationModel, "relation", uid)//设置联合主键@end

进行多表联合查询

  一切准备就绪,开始进行多表联合查询,我的目标就是查询后,只需要简单的遍历就能够实现联系人按照拼音首字母进行分类,重点是:遍历循环要尽可能的少 。我最初的方案如下:
对字母数组进行便利,根据索引进行数据库查询,然后执行的分类操作,但是运行后并没有出现sql语句的错误,结果却为空和开源库作者沟通,目前尚未有结果

//NSArray *indexArray = @[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"#"];WCTMultiSelect *multiSelect = [[YWWCDBHelper shareInstance].database prepareSelectMultiObjectsOnResults:YWContactModel.AllProperties.inTable(@"contact") fromTables:@[@"contact",@"contactRelation"]];[multiSelect where:YWContactRelationModel.ownerUid.inTable(@"contactRelation") == uid && YWContactRelationModel.uid.inTable(@"contactRelation") == YWContactModel.uid.inTable(@"contact") && YWContactModel.pinyin.inTable(@"contact").upper().substr(0, 1) == index];NSArray *resultArray = [multiSelect allMultiObjects];

项目不等人,我又想了一个折中的方案就是,让查询结果按照拼音字段进行分类,然后查询,从index='A’开始便利,如果联系人contact的拼音首字母和A相同,那么就进行失去操作添加拾取操作,如果不相同,就切换index为当前contact的拼音首字母。这样只需要一遍的循环遍历就可以实现联系人按照拼音字母进行分类。
修改后的方案如下:


NSMutableArray *datas = [NSMutableArray new];NSMutableArray *sectionIndexArray = [NSMutableArray new];WCTMultiSelect *multiSelect = [[YWWCDBHelper shareInstance].database prepareSelectMultiObjectsOnResults:YWContactModel.AllProperties.inTable(@"contact") fromTables:@[@"contact",@"contactRelation"]];[multiSelect where:YWContactRelationModel.ownerUid.inTable(@"contactRelation") == uid && YWContactRelationModel.uid.inTable(@"contactRelation") == YWContactModel.uid.inTable(@"contact")];[multiSelect groupBy:{YWContactModel.pinyin.inTable(@"contact")}];NSArray *resultArray = [multiSelect allMultiObjects];NSMutableArray *contacts = [NSMutableArray new];NSString *index = @"A";for (NSDictionary *dic in resultArray) {YWContactModel *contact = (YWContactModel *)[dic objectForKey:@"contact"];if ([contact.pinyin.uppercaseString hasPrefix:index]) {[contacts addObject:contact];if (![sectionIndexArray containsObject:index]) {[sectionIndexArray addObject:index];}}else{index = [contact.pinyin substringWithRange:NSMakeRange(0, 1)];[contacts addObject:contact];[sectionIndexArray addObject:index];[datas addObject:contacts];contacts = [NSMutableArray new];}}

更多优质文章,可以微信扫码关注:
这里写图片描述

wcdb官方文档


http://chatgpt.dhexx.cn/article/bumdQFCw.shtml

相关文章

WCDB使用笔记

本地数据加密 由于项目涉及到一些用户隐私数据的存储&#xff0c;所以需要对保存在客户端本地的数据进行加密&#xff0c;以防止用户隐私数据在设备被root的情况下出现泄漏。目前android的本地数据存储基本分为file&#xff0c;sharepreference和database&#xff0c;所以对数…

iOS开发通过微信学习WCDB(一)

最近通过对微信ipa包解压发现微信有使用WCDB这个开源库&#xff0c;搜索了一下了解到WCDB&#xff08;WeChat Database&#xff09;是一个高效、完整、易用的移动数据库框架&#xff0c;基于SQLCipher&#xff0c;支持iOS, macOS和Android。经过分析对比&#xff0c;个人感觉WC…

微信移动端数据库组件 WCDB 系列(三) — 解析 WINQ 原理

背景 高效、完整、易用是 WCDB 的基本原则。前几篇文章分享了 WCDB 的基本用法和修复工具&#xff0c;接下来将更深入地聊聊 WCDB 在易用性上的思考和实践。 对于各类客户端数据库&#xff0c;似乎都绕不开拼接字符串这一步。即便在 Realm 这样的 NoSQL 的数据库中&#xff0…

WCDB源码解析

源文链接&#xff1a;http://xiangwangfeng.com/2018/01/08/WCDB-源码解析 起因 最近开了个新项目&#xff0c;项目的主程童鞋引入了 WCDB 代替原先自制的 KeyValueStore 和 FMDB。问为何&#xff0c;答曰&#xff1a;好用&#xff0c;线程安全又高效。又问具体实现细节&#x…

IOS数据存储 之WCDB (二)WCDB.swift使用篇

IOS数据存储 之WCDB &#xff08;二&#xff09;WCDB.swift使用篇 1.WCDB.Swfit基础使用1.1 WCDB.Swfit 简介1.1.1 模型绑定1.1.2 创建数据库与表1.1.3 操作数据1.1.3.1 插入操作1.1.3.2 查找操作1.1.3.3 更新操作1.1.3.4 删除操作 1.2. 模型绑定1.2.1 Swift 模型绑定1.2.2 字段…

Android使用WCDB+Room 总结

最近项目有需要用到wcdb数据库&#xff0c;并且保证和IOS互通数据&#xff0c;在网上找很多相关资料&#xff0c;最后还是靠自己一点点摸索成功&#xff0c;现在做个总结。 一、在gradle 里加上 WCDB 相关的 room 组件 def room_version "2.3.0"// wcdb数据库和roo…

IOS数据存储 之WCDB (一)

IOS数据存储 之WCDB &#xff08;一&#xff09; 1. WCDB 简介1.1 使用WCDB框架3大优势1.2 WCDB 的一些基础概念1.2.1 类字段绑定&#xff08;ORM&#xff09;1.2.2 WINQ&#xff08;WCDB语言集成查询&#xff09;1.2.2.1 字段映射与运算符1.2.2.2 字段组合1.2.2.3 AllProperti…

iOS开发 数据存储之WCDB的介绍

一.介绍 WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS,macOS和Android 二.基本特性 易用,WCDB支持一句代码即可将数据取出并组合为object WINQ(WCDB语言集成查询):通过WINQ,开发者无须为了拼接SQL的字符串而写一大坨胶水代码ORM(Object Relational Ma…

开源微信小程序自助建站系统源码 含精美的多行业模板和搭建教程

分享一个微信小程序自助建站系统源码&#xff0c;含各行各业的小程序模板和搭建教程&#xff0c;可一键切换模板&#xff0c;自由DIY&#xff0c;搭建属于你自己的小程序。 特色功能一览&#xff1a; 11、支持创建多个小程序&#xff01;&#xff08;没有数量限制&#xff0c;后…

强大易用的开源建站工具Halo

最近无意间看到别人的博客外观非常美观&#xff0c;便萌生了偷师学艺的想法…所以就看到看了Halo这个开源的建站项目,其实使用起来非常简单&#xff0c;但是想要做一个类似的开源建站工具&#xff0c;谈何容易 访问官网 https://halo.run/ 使用docker部署 搜索镜像halo do…

14个免费好用的建站工具

有时候&#xff0c;我们想建立一个独立网站的时候&#xff0c;苦于自己技能不够&#xff0c;而迟迟没有行动&#xff0c;其实&#xff0c;我们真正的去构建一个独立网站的时候&#xff0c;我们并不需要多复杂的技术。我们也不一定要成为非常专业的程序员&#xff0c;因为现在&a…

推荐一款免费开源的建站系统 - AnqiCMS

安企内容管理系统(AnqiCMS)&#xff0c;是一款使用 GoLang 开发的企业站内容管理系统&#xff0c;它部署简单&#xff0c;软件安全&#xff0c;界面优雅&#xff0c;小巧&#xff0c;执行速度飞快&#xff0c;使用 AnqiCMS 搭建的网站可以防止众多安全问题发生。AnqiCMS 的设计…

介绍一款开源、高性价比的在线教育建站系统

今天给大家介绍一款开源在线教育建站系统——edusoho&#xff0c;项目是用PHP开发&#xff0c;所以基本上会搭建php站点就可以完成本次的搭建。 先看看安装之后的登录界面。 去官网下载源码 笔者下载企培开源版&#xff1a;edusoho-ct-21.4.5.zip 系统说明 1.系统&#xff1…

国内好用的五款开源建站系统

推荐5款优秀的开源建站系统,都有免费版本,有需要可以去试试。蝉知 蝉知系统是一款开源的的企业营销自助建站系统。它专为企业营销设计,伪静态网址、关键词、语义化结构,内置流量统计。 蝉知功能全面,文章发布、会员管理、论坛评论、产品展示等,并内置商城系统,商品、订…

免费开源的建站程序大全,不会编程也可以自助搭建网站了哦

想建网站又不会编程的小伙伴有福啦&#xff0c;本期推荐一些开源的cms建站程序&#xff0c;不需要写后端的任何逻辑代码&#xff0c;轻轻松松就可以建立自己的网站了&#xff0c;当然&#xff0c;要想网站有自己的个性&#xff0c;模版还是需要自己写的&#xff0c;只需要会简单…

绝了!小说建站项目完整开源

超棒的开源小说文学建站 CMS 系统&#xff0c;作为面试项目有牌面儿&#xff01; 编程导航开源仓库&#xff1a;https://github.com/liyupi/code-nav 大家好&#xff0c;我是鱼皮&#xff0c;今天给大家推荐一个优秀的开源 Java 全栈项目。 小说精品屋&#xff0c;是一套非常完…

最新首发自助建站系统源码,傻瓜式一键建站系统源码,高度开源支持专业在线自助建站服务平台软件

一佰互联,巅云门户自助建站系统v8建站平台版&#xff0c;历经3年不断打磨终于上线了。专业PS级大师级高端响应式智能建站平台软件&#xff0c;只为网络公司而生&#xff0c;采用国内知名开源php框架,Thinkphp6vue.js前端数据响应系统,实现了在线自助开通网站&#xff0c;企业站…

四大免费开源建站系统

原文&#xff1a;四大免费开源建站系统 - 知乎 第一&#xff1a; WordPress WordPress的主流客户是企业/个人的官网。一家公司不一定会在网上卖东西&#xff0c;但一定会需要一个官网。用WordPress做官网可谓是性价比最优选择。如果没有预算&#xff0c;你可以自己买几十美金的…

有哪些免费好用的开源建站程序/系统,推荐下?

我推荐WordPress建站程序&#xff0c;学习入门门槛很低&#xff0c;全世界近三分之一的网站都是采用wordpress,所以没有理由不去学习它。 我从一名小白变为wordpress建站老手&#xff0c;对比过很多建站程序&#xff0c;还是觉得wordpress能帮我节省时间和精力&#xff0c;让我…

开源自助建站系统源码完整源码+搭建教程 傻瓜式一键建站系统源码

一键傻瓜式自助建站系统源码&#xff0c;目前包含七百多套完整网站模板&#xff0c;全部都是响应式网站模板&#xff0c;傻瓜一键自助建站。开发组合PHPmysql&#xff0c;功能强大。 一键自助建站系统源码带安装教程&#xff0c;源码下载&#xff1a;春哥技术博客获取。自助建站…