Skip to content

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

License

Notifications You must be signed in to change notification settings

GIKICoder/GDataBase

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
gongke
Oct 23, 2018
ce1ac54 · Oct 23, 2018

History

37 Commits
Oct 23, 2018
Oct 23, 2018
Aug 9, 2017
Oct 23, 2018
Aug 9, 2017
Aug 9, 2017
Aug 9, 2017
Aug 9, 2017
Oct 24, 2017
Aug 9, 2017
Aug 9, 2017
Aug 9, 2017
Oct 9, 2018

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