iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用
前言
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
MJExtensionCodingImplementation
WCDB_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; //获取所有表的数据
@end
NS_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 PersonManager
static 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