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

总结

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

猜你喜欢

转载自blog.csdn.net/weixin_41732253/article/details/110248093