Skip to content

huachen206/HCKitProject

Repository files navigation

HCDB#

=========

###使用CocoaPods安装###

pod 'HCKitProject/HCDB', '~> 0.4.0'

###结构###

  • HCDAO
  • HCDBTable
  • HCDBModel
  • HCDBHelper
  • HCDBManager
  • HCDBTableField
  • HCVersionTable
  • NSObject+HCDBExtend

======== ##用法 以前做项目的时候,使用sql的时候很不方便,特别是在创建、改动表的时候,而且数据模型与表的关联很弱,同样改动时很麻烦。于是花了好几个月,几次推翻重来,完善了这个工具,并在项目中被很好的使用。

如果有更好的建议或者发现bug,欢迎联系我 [email protected]

主要是功能在于自动创建,修改表。而且增删改查都很方便。

示例代码可以查看工程中的HCDBDemo。 使用时如下:

    CarModel *car;
    NSArray *carList = [[DAO dao].carTable selectAll];
    if (carList.count) {
        car = carList.firstObject;
        car.wheelNumber ++;
        [[DAO dao].carTable replaceWithModel:car];
    }else{
        car = [CarModel defaultCar];
        [[DAO dao].carTable insertWithModel:car];
    }

    [[DAO dao].carTable deleteWithModel:car];

要达到使用的程度,需要至少创建三个类。其中DBModel与DBTable是一一对应的。DAO则可以管理多个DBTable。

###1.创建数据模型 创建数据模型,继承HCDBModel

其中需要注意有4个用于修饰属性的宏:

  • HC_PRIMARY_KEY (设置主键)
  • HC_AUTOINCREMENT (自增)
  • HC_PRIMARY_KEY_AUTOINCREMENT (设置主键且自增)
  • HC_IGNORE (忽略)

自定义的对象是不支持的,不过不用担心,不支持的类型在运行时会有assert提示。注意*放在宏的前面,不要放在括号里

@interface VehicleModel : HCDBModel
@property (nonatomic,assign) NSUInteger HC_PRIMARY_KEY_AUTOINCREMENT(vid);
@property (nonatomic,strong) NSString *scientificName;
@property (nonatomic,strong) NSString *manufacturer;
@property(nonatomic,strong) NSData *attachData;

@property (nonatomic,assign,getter=isFantasy) BOOL fantasy;
@property (nonatomic,assign) float weight;
@property (nonatomic,assign) long maxSpeed;
@property (nonatomic,assign) double displacement;

@property (nonatomic,assign) id HC_IGNORE(driver);
@property (nonatomic,strong) NSObject *HC_IGNORE(forIgnoreExample);

-(BOOL)isFantasy;
@end

@interface CarModel : VehicleModel
@property (nonatomic,assign) int wheelNumber;
@end

@interface PlaneModel : VehicleModel
@property (nonatomic,assign) int wingNumber;
@property (nonatomic,assign) float maxHeight;
@end

在默认状态下,只会处理自身定义的属性,重载depth方法后,可以设置是否处理父类定义的属性,具体看方法描述。

@implementation CarModel
+(NSInteger)depth{
    return 2;
}
@end
@implementation PlaneModel
+(NSInteger)depth{
    return 2;
}
@end

###2.创建关联表 创建表对象,继承HCDBTable,将第一步中创建的模型对象关联上。

@interface Table_carModel : HCDBTable

@end
@interface Table_planeModel : HCDBTable

@end

表中关联模型,并根据需要自定义筛选数据的条件。这里需要写sql语句,或者可以使用其他第三方库来写查询方法。

@implementation Table_carModel
-(Class)tableModelClass{
    return [CarModel class];
}

-(NSArray *)selectWithWheelNumber:(int)wheelNumber{
    __block NSArray *models = nil;
    [self.fmDbQueue inDatabase:^(FMDatabase *db) {
        FMResultSet *rs = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@ WHERE deviceId = %@",self.tableName,@(wheelNumber)]];
        models = [self modelListWithFMResultSet:rs];
    }];
    return models;
}

@end
@implementation Table_planeModel
-(Class)tableModelClass{
    return [PlaneModel class];
}

@end

###3.创建DAO

创建DAO,继承HCDAO,并关联表。

一个DAO管理多个表,且存在同一个SQL文件下,重载baseDBHelper方法,可指定路径。

通常一个项目,只需要一个DAO,可以使用默认路径。

#import "HCDAO.h"
#import "Table_carModel.h"
#import "Table_planeModel.h"
@interface DAO : HCDAO
@property (nonatomic,strong) Table_carModel *carTable;
@property (nonatomic,strong) Table_planeModel *planeTable;

@end

#import "DAO.h"

@implementation DAO
@synthesize baseDBHelper = _baseDBHelper;

-(HCDBHelper *)baseDBHelper{
    NSString *dbFileName = @"VehicleDBFile";
    NSString *dbPath =[HCDBHelper dbPathWithFileName:dbFileName];
    _baseDBHelper =[[HCDBManager shared] dbHelperWithDbPath:dbPath];
    if (!_baseDBHelper) {
        _baseDBHelper = [[HCDBHelper alloc] initWithDbFileName:dbFileName];
        [[HCDBManager shared] addDBHelper:_baseDBHelper];
    }
    return _baseDBHelper;
}

@end

##4.扩展功能

表结构更新后,进行数据迁移。通过复制-新建-插入数据-删除旧表 的方法支持删除字段,但还是建议尽量不要删除字段。

#import "Table_carModel.h"
@implementation Table_carModel
-(Class)tableModelClass{
    return [CarModel class];
}

-(NSInteger)tableVersion{
    //默认为1,每次表结构变动且需要数据迁移时,将此值+1;
    return 3;
}

-(BOOL)tableMigrationWithCurrentTableVersion:(NSInteger)currentVersion{
    //此调用在表结构升级之前,version会逐级上升。建议尽量不要删除字段
    if (currentVersion == 2) {
        //do something 比如将数据全部取出
    }else if (currentVersion ==3){
        
        
    }
    return YES;
}

-(BOOL)autoUpgradeTable{
    BOOL success =[super autoUpgradeTable];
    if (success) {
        //此时表已升级为最新,与当前DBModel相匹配。
    }
    return success;
}
@end

License

AFNetworking is released under the MIT license. See LICENSE for details.

About

No description, website, or topics provided.

Resources

License

Stars

2 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors