Skip to content

基于FMDB的ORM数据库存储解决方案. 面向模型API. 一句代码存储,读取.对存储模型无需继承BaseObject. 可自定义多主键,可使用sqlite 关键字.可自定义序列化字段等.极大方便项目中使用.

License

Notifications You must be signed in to change notification settings

GIKICoder/GDataBase

Repository files navigation

GDataBase

License MIT  Build Status 

Features

  • 对于FMDB基于ORM的封装.方便项目中使用.
  • 所有API基于FMDBQueue,保证线程安全.
  • 由于ORM字符串拼接,执行效率会有损耗.
  • 支持sqlite 保留字作为字段插入. 无需考虑模型属性命名.
  • 支持多主键,单一主键,自增主键数据表创建
  • 支持模型黑名单. 可以自定义部分字段不进行数据库存储操作.
  • 支持模型字段自定义序列化.
  • 无需手动创建数据表.
  • 无需考虑数据库字段整添,自动处理数据库升级.免去升级烦恼.
  • 支持数据库表存储value base64编/解码.
  • 对模型无侵入,只需遵守相关协议即可.
  • 数据查询支持链式语法调用.
  • 功能以及代码还在更新完善中. 后期会支持更多功能.欢迎star.或者提建议改进
  • 后续会支持创建关联表,建索引等常用功能.

Usage

主要结构

- GDataObjectProtocol : 所有需要操作模型需要此遵守协议
- GDataBase : 数据库操作类

DB创建

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
path = [path stringByAppendingString:@"GDATA.db"];    
self.database = [GDataBase databaseWithPath:path];

ORM模型

@interface GAppsDataViewModel : NSObject<GDataObjectProtocol>
@property (nonatomic, strong) NSString  *dataID;
@property (nonatomic, copy) NSString  *fields;
@property (nonatomic, assign) int  dataGroup;
/// index,ID,group等为sqlite保留字.GDatabase中已经做过处理,可直接使用
@property (nonatomic, assign) NSInteger  index;

@property (nonatomic, strong) NSArray<GSubModel*>   *datas;

@end

@implementation GAppsDataViewModel
///在第一行注入此宏即可使用GDatabase 进行模型存储
GDATABASE_IMPLEMENTATION_INJECT(GAppsDataViewModel)

/// 以下协议方法均可不实现

/// 如不实现此方法. 数据表默认为自增主键 'GAUTOPRIMARYKEY' 
- (NSArray<NSString *> *)g_GetCustomPrimarykey
{
  return @[@"dataID"];//单一主键
// return @[@"dataID",@"dataGroup"]; // 多主键
}

/// 如实现此方法. 所有key 值均不会参与数据库存储
- (NSDictionary<NSString *,NSString *> *)g_blackList
{
  return @{
            @"fields" :@"fields",   
            };
}

/// 自定义归档属性
- (id)g_ArchiveProperty:(NSString*)property_name
{
    if ([property_name isEqualToString:@"datas"]) {
    NSData *data = [self.datas yy_modelToJSONData];
    return data;
    }
    return nil;
}

/// 自定义接档属性
- (void)g_UnarchiveSetData:(id)data property:(NSString*)property_name
{
    if ([property_name isEqualToString:@"datas"]) {
    NSError *eror = nil;
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&eror];
    self.datas = [NSArray yy_modelArrayWithClass:[GSubModel class] json:array];
}

}

/// 如需要自定义归解档的属性名称以及需要归档的sqlite 字段类型,实现此方法
+ (NSDictionary<NSString *,NSString*> *)g_customArchiveList
{
    return @{
        @"datas" : GBLOB_TYPE,
        };
}


@end

模型存储

- (BOOL)addObject:(id)model;
会自动处理数据表建立,以及字段升级等问题. 无需单独创建数据表
/// 单条
- (void)insertOneRowData
{
  GAppsDataViewModel * model = [[GAppsDataViewModel alloc] init];
  model.dataID = @"WOSHI_dataID";
  model.fields = @"1234567";
  model.dataGroup = 12;
  model.index = 12;
  BOOL isSucess = [self.database addObject:model];
}

/// 多条插入
- (void)insertLargeDataNOInTransaction
{
  BOOL isSucess =   [self.database addObjects:self.models WithTableName:nil];
}

/// 开启事务_异步线程插入
- (void)insertLargeData
{
  __weak typeof(self) weakSelf = self;
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
  BOOL isSucess =   [weakSelf.database addObjectsInTransaction:weakSelf.models WithTableName:nil];
  });
}

模型读取

/// 获取GAppsDataViewModel全部数据
- (void)getAllData
{
    NSArray * all = [self.database getAllObjectsWithClass:[GAppsDataViewModel class]];
}

/// 根据条件获取数据
- (void)querySqlData
{
    NSArray *Datas = [self.database getObjectsWithClass:[GAppsDataViewModel class] withTableName:@"GAppsDataViewModel"      whereCond:@"dataID= '%@' AND dataGroup=%d",@"WOSHI_dataID",12];
}
- (void)queryOrderbylimit
{
    NSString *str = @"str";
    NSArray *datas = [self.database getObjectsWithClass:[GAppsDataViewModel class] withTableName:nil orderBy:@"dataID" limit:10 cond:@"dataID='%@' and dataGroup='%@'",str,str];

}

- (void)querySelectSqlData
{

    NSArray *  array = [[[[[[self.database selectClazz:[GAppsDataViewModel class]]
whereProperty:@"dataID"] equal:@"WOSHI_dataID"]
orderby:@"dataID" asc:YES]
limit:10]
queryObjectsWithClazz:[GAppsDataViewModel class]];

}

/// 链式调用查询db
- (void)querySelectSqlData
{
NSArray * arrray = self.database
.selectTableName(@"GAppsDataViewModel")
.whereProperty(@"dataID")
.equal(@"WOSHI_dataID")
.andProperty(@"dataGroup")
.equal(@12)
.queryObjectsWithClass(NSClassFromString(@"GAppsDataViewModel"));
}

模型更新

///字段更新
- (void)updateSqlData
{
    BOOL isSucess = [self.database updateObjectClazz:[GAppsDataViewModel class] keyValues:@{@"fields":@"我被修改了"} cond:@"dataIndex = %ld and dataGroup = %ld",12,12,nil];
}

- (void)updateObject
{
    NSArray *objects = [self.database getAllObjectsWithClass:[GAppsDataViewModel class]];
    id object = [objects firstObject];
    object.index = 10;

/********* 自增主键
    long autoPri = [object g_getAutoPrimaryKey];
    GAppsDataViewModel * dataModel = [GAppsDataViewModel new];
    dataModel.dataID = @"WOSHI_dataID";
    dataModel.fields = @"1234567";
    dataModel.dataGroup = 12;
    dataModel.dataIndex = 12;
    [dataModel setValue:@(autoPri) forKey:GAUTOPRIMARYKEY];
*********/
    [self.database addObject:objects];
}

删除操作

- (void)deleteObject
{
NSArray * datas = [self.database getAllObjectsWithClass:[GAutoPrimaryKeyModel class]];
BOOL isSucess = [self.database deleteObject:[datas firstObject]];
// or BOOL isSucess = [self.database deleteObjects:datas];
}

- (void)deleteTable
{
[self.database removeTableWithClass:[GAutoPrimaryKeyModel class];
//or [self.database removeTable:@"GAutoPrimaryKeyModel"];
}

数据表count查询

- (void)querySqlTableCount
{
    long count = [self.database countInDataBaseWithClass:[GAppsDataViewModel class] withTableName:nil cond:nil];
}

支持

-该项目最低支持 iOS 7.0Xcode 8.0

-暂不支持CocoaPods及其他安装方式.

About

基于FMDB的ORM数据库存储解决方案. 面向模型API. 一句代码存储,读取.对存储模型无需继承BaseObject. 可自定义多主键,可使用sqlite 关键字.可自定义序列化字段等.极大方便项目中使用.

Resources

License

Stars

Watchers

Forks

Packages

No packages published