- 对于FMDB基于ORM的封装.方便项目中使用.
- 所有API基于FMDBQueue,保证线程安全.
- 由于ORM字符串拼接,执行效率会有损耗.
- 支持sqlite 保留字作为字段插入. 无需考虑模型属性命名.
- 支持多主键,单一主键,自增主键数据表创建
- 支持模型黑名单. 可以自定义部分字段不进行数据库存储操作.
- 支持模型字段自定义序列化.
- 无需手动创建数据表.
- 无需考虑数据库字段整添,自动处理数据库升级.免去升级烦恼.
- 支持数据库表存储value base64编/解码.
- 对模型无侵入,只需遵守相关协议即可.
- 数据查询支持链式语法调用.
- 功能以及代码还在更新完善中. 后期会支持更多功能.欢迎star.或者提建议改进
- 后续会支持创建关联表,建索引等常用功能.
- GDataObjectProtocol : 所有需要操作模型需要此遵守协议
- GDataBase : 数据库操作类
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
path = [path stringByAppendingString:@"GDATA.db"];
self.database = [GDataBase databaseWithPath:path];
@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"];
}
- (void)querySqlTableCount
{
long count = [self.database countInDataBaseWithClass:[GAppsDataViewModel class] withTableName:nil cond:nil];
}
-该项目最低支持 iOS 7.0
和 Xcode 8.0
。
-暂不支持CocoaPods及其他安装方式.