iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用

article/2025/10/9 9:53:31

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用

    • 前言
    • 开发前准备
    • 开发
      • 关于生成WCDB文件 选择new file即可找到
      • 关于嵌套模型的生成 分两步 选择new file即可找到
      • 增删改查的封装
      • 使用
    • 总结

前言

iOS开发中有需要数据库的存储,表的增删改查等,FMDB和最近流行的WCDB都是我们的不二之选。

开发前准备

  • 导入WCDB
    pod 'WCDB'
  • 导入WCDB辅助转模型
    pod 'MJExtension'

开发

关于生成WCDB文件 选择new file即可找到

在这里插入图片描述

  • 生成的WCDB文件 如下
    在这里插入图片描述
  • PersonModel.h
#import <Foundation/Foundation.h>@class StudentModel;
@interface PersonModel : NSObject@property(nonatomic, assign) NSInteger personId; //主键
@property(nonatomic, strong) NSString *name;
@property(nonatomic, assign) NSInteger age;@property(nonatomic, strong) StudentModel *studentModel;@end
  • PersonModel.mm
#import "PersonModel+WCTTableCoding.h"
#import "PersonModel.h"
#import <WCDB/WCDB.h>//嵌套模型
#import <MJExtension/MJExtension.h>
#import "StudentModel.h" //嵌套模型@implementation PersonModel+ (NSDictionary *)mj_objectClassInArray { //嵌套模型return @{@"StudentModel":@"studentModel",};
}WCDB_IMPLEMENTATION(PersonModel)
WCDB_SYNTHESIZE_COLUMN(PersonModel, personId, "id") //主键
WCDB_SYNTHESIZE_COLUMN(PersonModel, name, "name")
WCDB_SYNTHESIZE_COLUMN(PersonModel, age, "age")WCDB_SYNTHESIZE_COLUMN(PersonModel, studentModel, "studentModel")//Not null
WCDB_NOT_NULL(PersonModel, personId) //设置这个字段非空WCDB_PRIMARY_AUTO_INCREMENT(PersonModel, personId) //自动递增主键- (instancetype)init {if (self = [super init]) {self.isAutoIncrement = YES; //开启自增}return self;
}@end
  • PersonModel+WCTTableCoding.h
#import "PersonModel.h"
#import <WCDB/WCDB.h>@interface PersonModel (WCTTableCoding) <WCTTableCoding>WCDB_PROPERTY(personId) //主键
WCDB_PROPERTY(name)
WCDB_PROPERTY(age)@end

关于嵌套模型的生成 分两步 选择new file即可找到

  • 先生成TableCodable
    在这里插入图片描述
  • StudentModel.h
#import <Foundation/Foundation.h>@interface StudentModel : NSObject@property(nonatomic, strong) NSString *studentId;
@property(nonatomic, strong) NSString *sex;@end
  • StudentModel.mm
#import "StudentModel+WCTTableCoding.h"
#import "StudentModel.h"
#import <WCDB/WCDB.h>
#import <MJExtension/MJExtension.h>@implementation StudentModel
MJExtensionCodingImplementationWCDB_IMPLEMENTATION(StudentModel)
WCDB_SYNTHESIZE(StudentModel, studentId)
WCDB_SYNTHESIZE(StudentModel, sex)WCDB_PRIMARY_AUTO_INCREMENT(StudentModel, studentId) //自动递增主键- (instancetype)init {if(self = [super init]) {self.isAutoIncrement = YES;}return self;
}@end
  • StudentModel+WCTTableCoding.h
#import "StudentModel.h"
#import <WCDB/WCDB.h>@interface StudentModel (WCTTableCoding) <WCTTableCoding>WCDB_PROPERTY(studentId)
WCDB_PROPERTY(sex)@end
  • 再生成ColumnCodable 会得到下面一个文件
    在这里插入图片描述
  • StudentModel+WCTColumnCoding.mm
#import "StudentModel.h"
#import <Foundation/Foundation.h>
#import <WCDB/WCDB.h>//嵌套模型
@interface StudentModel (WCTColumnCoding) <WCTColumnCoding>
@end@implementation StudentModel (WCTColumnCoding)+ (instancetype)unarchiveWithWCTValue:(NSData *)value
{return value? [NSKeyedUnarchiver unarchiveObjectWithData:value]:nil;
}- (NSData *)archivedWCTValue
{return [NSKeyedArchiver archivedDataWithRootObject:self];
}+ (WCTColumnType)columnTypeForWCDB
{return WCTColumnTypeBinary;
}@end

增删改查的封装

  • PersonManager.h
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN
@class PersonModel;
@interface PersonManager : NSObject+ (instancetype)data;#pragma mark - insert
- (BOOL)insertDataToDB:(PersonModel *)model; //插入单个数据#pragma mark - delete
- (BOOL)deleteDataToDB:(NSInteger)personId; //删除单个数据#pragma mark - update
- (BOOL)updateNameToDB:(NSString *)name personId:(NSInteger)personId; //更新语音的消息#pragma mark - get
- (NSArray<PersonModel *> *)getAllData; //获取所有表的数据@endNS_ASSUME_NONNULL_END
  • PersonManager.mm
#import "PersonManager.h"
#import "PersonModel+WCTTableCoding.h"
#import "PersonModel.h"
#import <WCDB/WCDB.h>static PersonManager *kPersonManager = nil;
static NSString *const kPersonDBName = @"Person.sqlite";//消息列表的数据库名称
static NSString *const kPersonTableName = @"PersonTable";//消息列表的表名称
@interface PersonManager ()@property(nonatomic, strong) WCTDatabase *database;@end@implementation PersonManagerstatic dispatch_once_t onceToken;
+ (instancetype)data {dispatch_once(&onceToken, ^{kPersonManager = [[self alloc] init];});return kPersonManager;
}+ (instancetype)allocWithZone:(struct _NSZone *)zone {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{kPersonManager = [super allocWithZone:zone];});return kPersonManager;
}- (id)copyWithZone:(NSZone *)zone {return kPersonManager;
}- (id)mutableCopyWithZone:(NSZone *)zone {return kPersonManager;
}- (instancetype)init {if(self = [super init]) {[self database];}return self;
}- (WCTDatabase *)database {if(_database == nil) {//注意,此处数据库名字不要带sqlite的后缀名NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *docDir = [paths objectAtIndex:0];NSString *path = [docDir stringByAppendingPathComponent:kPersonDBName];_database = [[WCTDatabase alloc] initWithPath:path];BOOL result = [_database createTableAndIndexesOfName:kPersonTableName withClass:[PersonModel class]];if (result) {return _database;}}return _database;
}#pragma mark - insert- (BOOL)insertDataToDB:(PersonModel *)model { //插入单个数据BOOL result = [self.database insertObject:model into:kPersonTableName];model.personId = (NSInteger)model.personId;return result;
}#pragma mark - delete- (BOOL)deleteDataToDB:(NSInteger)personId { //删除单个数据BOOL result = [self.database deleteObjectsFromTable:kPersonTableName where:PersonModel.personId == personId];return result;
}#pragma mark - update- (BOOL)updateNameToDB:(NSString *)name personId:(NSInteger)personId { //更新语音的消息PersonModel *model = [[PersonModel alloc] init];model.name = name;BOOL result = [self.database updateRowsInTable:kPersonTableName onProperties:PersonModel.name withObject:model where:model.personId == personId];return result;
}#pragma mark - get- (NSArray<PersonModel *> *)getAllData { //获取所有表的数据return [self.database getAllObjectsOfClass:[PersonModel class] fromTable:kPersonTableName];
}@end
  • 注意 因为是C++,所以都是.mm结尾
  • 总文件
    在这里插入图片描述

使用

  • ViewController.m
#import "ViewController.h"
#import "PersonManager.h"
#import "PersonModel.h"
#import "StudentModel.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];PersonModel *model = [[PersonModel alloc]init];model.name = @"小张";model.studentModel = [[StudentModel alloc]init];model.studentModel.sex = @"nan";[[PersonManager data] insertDataToDB:model];
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {NSArray<PersonModel *> *arr = [[PersonManager data] getAllData];NSLog(@"alldata %@", arr);
}@end

总结

  • 以上就可以大概的使用WCDB了,如果还是需要其他详细的说明,可以直接查看它的文档
  • 文档链接
  • Demo地址

http://chatgpt.dhexx.cn/article/0q0XNR4I.shtml

相关文章

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

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

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;让我…