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地址