Coder Social home page Coder Social logo

gikicoder / gdatabase Goto Github PK

View Code? Open in Web Editor NEW
73.0 3.0 18.0 1.71 MB

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

License: MIT License

Objective-C 93.67% Ruby 6.33%

gdatabase's Introduction

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及其他安装方式.

gdatabase's People

Contributors

gikicoder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

gdatabase's Issues

can not open db file

在5s 的机型上,使用报错,系统10.3.2,Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'can not open db file'

几万条数据怎么处理?

直接运行Demo, addObjectsInTransaction插入 5W条数据,耗时30s,
读取 getAllObjectsWithClass 也是,耗时很高

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.