Code Monkey home page Code Monkey logo

bgfmdb's Introduction

BGFMDB让数据的增删改查分别只需要一行代码即可,就是这么简单任性.

最新重大更新:

1.增加了自定义“联合主键”的功能.
2.进行了大重构,优化缩减API,支持多个'唯一约束',ignoredKeys放到模型类.m文件实现bg_ignoreKeys类函数即可,增加自定义表名功能.

Swift工程中使用方式

目前可以存储Swift工程中的OC类model,在桥接文件导入OC类model的头文件即可, 但是不能解析存储Swift类model,后面会补上Swift类model解析部分😊.

小伙伴们的使用反馈

BGFMDB

交流QQ群:

使用交流QQ群: 572359447
如果在使用过程中发现什么问题或有什么疑问,请加群反馈.

完美支持:

int,long,signed,float,double,NSInteger,CGFloat,BOOL,NSString,NSMutableString,NSMutableAttributedString,NSAttributedString,NSNumber,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSMapTable,NSHashTable,NSData,NSMutableData,UIImage,NSDate,NSURL,NSRange,CGRect,CGSize,CGPoint,自定义对象 等的存储.

写本库的动机: 在对coredata和realm做了探究总结后,发现了很多有缺陷的地方,最明显的就是下面的原因:

realm缺陷:

Realm不支持集合类型,这一点也是比较蛋疼。
Realm支持以下的属性类型:BOOL、bool、int、NSInteger、long、long long、float、double、NSString、NSDate、NSData以及 被特殊类型标记的NSNumber。CGFloat属性的支持被取消了,因为它不具备平台独立性。
这里就是不支持集合,比如说NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSSet,NSMutableSet。如果服务器传来的一个字典,key是一个字符串,对应的value就是一个数组,这时候就想存储这个数组就比较困难了。

coredata缺陷:

coredata虽然通过Transformable可以存取集合类型,但需要开发者去进行转换处理,使用起来不方便直观,虽然coredata有很多好用的封装库,像ResKit,MMRecord等,但这些库比较庞大,而且都是英文介绍,不利于国内初中级开发的快速开发使用.

虽然国内也已经有了对FMDB面相对象层的封装,比如像JRDB,LKDBHelper等,但是在使用总结后还是发现不少的问题,问题如下:

JRDB存储数组需要传入对象的泛型,同时还要复写一些函数和映射,这对于初中级开发者是很不利的,看的很萌逼.
LKDBHelper好一点,但也要复写不少的函数,而且LKDBHelper的使用demo有点乱,还有就是不支持NSMaptable,NSHashTable的存储,LKDBHelper还有一个致命的弱点就是当类变量名称跟sqlite的关键字一样时,会发生冲突错误!

而最重要的是: JRDB,LKDBHelper都不支持同一数组中存储不同类型的自定义类型数据,BGFMDB则完美支持,JRDB,LKDBHelper已经成为过去,现在是BGFMDB的时代,作者的宣言是:“要把BGFMDB写成不会写代码的人都会用的库”,欢迎大家反馈和吐槽问题,*年作者等着你们.

综合上述原因后,我决定写一款适合国内初中级开发者使用的存储封装库(BGFMDB),不管是从使用步骤还是支持的存储类型上,都比JRDB,LKDB简单好用和全面.

本库几乎支持存储ios所有基本的自带数据类型.

使用介绍(喜欢的话别忘了给本库一个Star😊).

想加密数据库的,请借鉴此demo:SQLCipherDemo

CocoaPods的方式.

Podfile

platform :ios, '8.0'

target '工程名称' do
pod 'BGFMDB', '~> 2.0.9'
end

直接下载库代码使用方式.

添加所需依赖库

libsqlite3

导入头文件

/**
只要在自己的类中导入了BGFMDB.h这个头文件,本类就具有了存储功能.
*/
#import <Foundation/Foundation.h>
#import "BGFMDB.h"
@interface stockModel : NSObject
@property(nonatomic,copy)NSString* name;
@property(nonatomic,strong)NSNumber* stockData;
+(instancetype)stockWithName:(NSString*)name stockData:(NSNumber*)stockData;
@end

主键

/**
本库自带的自动增长主键.
*/
@property(nonatomic,strong)NSNumber*_Nullable bg_id;

/**
 为了方便开发者,特此加入以下两个字段属性供开发者做参考.(自动记录数据的存入时间和更新时间)
 */
@property(nonatomic,copy)NSString* _Nonnull bg_createTime;//数据创建时间(即存入数据库的时间)
@property(nonatomic,copy)NSString* _Nonnull bg_updateTime;//数据最后那次更新的时间.

/**
 自定义表名
 */
@property(nonatomic,copy)NSString* _Nonnull bg_tableName;

联合主键

/**
 自定义“联合主键” ,这里指定 name和age 为“联合主键”.
 */
+(NSArray *)bg_unionPrimaryKeys{
    return @[@"name",@"age"];
}

唯一约束

/**
 如果需要指定“唯一约束”字段, 在模型.m文件中实现该函数,这里指定 name和age 为“唯一约束”.
 */
+(NSArray *)bg_uniqueKeys{
    return @[@"name",@"age"];
}

设置不需要存储的属性

/**
 设置不需要存储的属性, 在模型.m文件中实现该函数.
 */
+(NSArray *)bg_ignoreKeys{
   return @[@"eye",@"sex",@"num"];
}

初始化对象

People* p = [self people];

存储

/**
同步存储.
*/
[p bg_save];

/**
异步存储.
*/
[p bg_saveAsync:^(BOOL isSuccess) {
       //you code
   }];
   
/**
覆盖掉原来People类的所有数据,只存储当前对象的数据.
*/
[p bg_cover];

/**
 同步存储或更新.
 当"唯一约束"或"主键"存在时,此接口会更新旧数据,没有则存储新数据.
 提示:“唯一约束”优先级高于"主键".
 */
 [p bg_saveOrUpdate];
 
/**
同步 存储或更新 数组元素.
当"唯一约束"或"主键"存在时,此接口会更新旧数据,没有则存储新数据.
提示:“唯一约束”优先级高于"主键".
*/
[People bg_saveOrUpdateArray:@[p,p1,p2]];

查询

/**
同步查询所有数据.
*/
NSArray* finfAlls = [People bg_findAll:bg_tablename];

/**
按条件查询.
*/
NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"斯巴达")];
NSArray* arr = [People bg_find:bg_tablename where:where];

/**
 直接写SQL语句操作.
 */
NSArray* arr = bg_executeSql(@"select * from yy", bg_tablename, [People class]);//查询时,后面两个参数必须要传入.

/**
 根据范围查询.
*/
NSArray* arr = [People bg_find:bg_tablename range:NSMakeRange(i,50) orderBy:nil desc:NO];

更新

/**
 单个对象更新.
 支持keyPath.
 */
 NSString* where = [NSString stringWithFormat:@"where %@ or %@=%@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"]),bg_sqlKey(@"age"),bg_sqlValue(@(31))];
  [p bg_updateWhere:where];
  
/**
 sql语句批量更新.
 */
  NSString* where = [NSString stringWithFormat:@"set %@=%@ where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"马化腾"),bg_sqlKey(@"name"),bg_sqlValue(@"天朝")];
  [People bg_update:bg_tablename where:where];  
  
/**
 直接写SQL语句操作
 */
bg_executeSql(@"update yy set BG_name='标哥'", nil, nil);//更新或删除等操作时,后两个参数不必传入.

删除

/**
 按条件删除.
 */
NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"斯巴达")];
[People bg_delete:bg_tablename where:where];

/**
清除表的所有数据.
*/
[People bg_clear:bg_tablename];

/**
删除数据库表.
*/
[People bg_drop:bg_tablename];

获取类数据库版本

/**
 获取该类的数据库版本号;
*/
NSInteger version = [People bg_version:bg_tablename];

类数据库版本手动升级(当'唯一约束','联合主键','属性类型改变',发生改变时需要手动调用升级,其他情况库自动检测升级)

//注: 版本号从1开始,依次往后递增,本次更新版本号不得 低于或等于 上次的版本号,否则不会更新.
/**
 如果类'唯一约束','联合主键','属性类型'发生改变.
 则调用此API刷新该类数据库,不需要新旧映射的情况下使用此API.
*/
[People bg_update:bg_tablename version:version];

/**
如果类'唯一约束','联合主键','属性类型'发生改变.
则调用此API刷新该类数据库.data2是新变量名,data是旧变量名,即将旧的值映射到新的变量名,其他不变的变量名会自动复制,只管写出变化的对应映射即可.
*/
[People bg_update:bg_tablename version:version keyDict:@{@"data2":@"data"}];

事务操作

/**
事务操作,返回YES提交事务,返回NO则回滚事务.
*/
bg_inTransaction(^BOOL{
        [p bg_save];//存储
        return NO;
    });

快速查询数据条数

/**
按条件查询表中所有数据的条数.
*/
NSInteger count = [People bg_count:bg_tablename where:nil];

类数据之间的拷贝

/**
 将People表的数据拷贝给bg_tablename表, name拷贝给Man的Man_name,其他同理.
 */
 [People bg_copy:nil toTable:bg_tablename keyDict:@{@"name":@"Man_name",
                                                       @"num":@"Man_num",
                                                       @"age":@"Man_age",
                                                       @"image":@"image"} append:NO];

直接存取数组

NSMutableArray* testA = [NSMutableArray array];
    [testA addObject:@"我是"];
    [testA addObject:@(10)];
    [testA addObject:@(9.999)];
    [testA addObject:@{@"key":@"value"}];
    /**
     存储标识名为testA的数组.
     */
    [testA bg_saveArrayWithName:@"testA"];
    
    /**
     往标识名为@"testA"的数组中添加元素.
     */
    [NSArray bg_addObjectWithName:@"testA" object:@[@(1),@"哈哈"]];
    
    /**
     删除标识名为testA的数组某个位置上的元素.
     */
    [NSArray bg_deleteObjectWithName:@"testA" Index:3];
    
    /**
     查询标识名为testA的数组全部元素.
     */
    NSArray* testResult = [NSArray bg_arrayWithName:@"testA"];
    
    /**
     获取标识名为testA的数组某个位置上的元素.
     */
    id arrObject = [NSArray bg_objectWithName:@"testA" Index:3];
    
    /**
     清除标识名为testA的数组所有元素.
     */
    [NSArray bg_clearArrayWithName:@"testA"];

直接存取字典

NSDictionary* dict = @{@"one":@(1),@"key":@"value",@"array":@[@(1.2),@"哈哈"]};
    /**
     存储字典.
     */
    [dict bg_saveDictionary];
    
    /**
     添加字典元素.
     */
    [NSDictionary bg_setValue:@"标哥" forKey:@"name"];
    
    /**
     获取某个字典元素.
     */
    id num = [NSDictionary bg_valueForKey:@"one"];
    
    /**
     移除字典某个元素.
     */
    [NSDictionary bg_removeValueForKey:@"key"];
    
    /**
     遍历字典元素.
     */
    [NSDictionary bg_enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, id  _Nonnull value, BOOL *stop) {
        NSLog(@"key = %@ , value = %@",key,value);
    }];
    
    /**
     清空字典.
     */
    [NSDictionary bg_clearDictionary];

注册数据变化监听

/**
注册监听bg_tablename表的数据变化,唯一识别标识是@"change".  
*/
[People bg_registerChangeForTableName:bg_tablename identify:@"change" block:^(bg_changeState result) {
        switch (result) {
            case bg_insert:
                NSLog(@"有数据插入");
                break;
            case bg_update:
                NSLog(@"有数据更新");
                break;
            case bg_delete:
                NSLog(@"有数据删删除");
                break;
            case bg_drop:
                NSLog(@"有表删除");
                break;
            default:
                break;
        }
    }];

移除数据监听

/**
移除bg_tablename表数据变化的监听,唯一识别标识是@"change".  
*/
 [People bg_removeChangeForTableName:bg_tablename identify:@"change"];

字典转模型

NSDictionary* dictAni = [self getDogDict];
/**
一代码搞定字典转模型.
*/
Dog* dog = [Dog bg_objectWithKeyValues:dictAni];

NSDictionary* dictMy = [self getMyDict];
/**
一代码搞定字典转模型.
*/
My* my = [My bg_objectWithDictionary:dictMy];

模型转字典

/**
一句代码搞定模型转字典.
*/
 NSDictionary* dictBodyAll = [body bg_keyValuesIgnoredKeys:nil];
 
/**
忽略掉hand这个变量不转.
*/
NSDictionary* dictBody = [body bg_keyValuesIgnoredKeys:@[@"hand"]];

如果模型中的数组变量存储的是自定义类,则需要实现下面的这个函数:

/**
如果模型中有数组且存放的是自定义的类(NSString等系统自带的类型就不必要了),那就实现该函数,key是数组名称,value是自定的类Class,用法跟MJExtension一样.
(‘字典转模型’ 或 ’模型转字典‘ 都需要实现该函数)
*/
+(NSDictionary *)bg_objectClassInArray{
    return @{@"dogs":[Dog class],@"bodys":[Body class]};
}

/**
 如果模型中有自定义类变量,则实现该函数对应进行集合到模型的转换.
 将json数据中body这个key对应的值转化为Body类变量body对象.
 */
+(NSDictionary *)bg_objectClassForCustom{
    return @{@"body":[Body class]};
}

/**
 替换变量的功能(及当字典的key和属性名不一样时,进行映射对应起来)
 即将字典里key为descri的值 赋给 属性名为intro的变量,性别和sex同理.
 */
+(NSDictionary *)bg_replacedKeyFromPropertyName{
    return @{@"descri":@"intro",@"性别":@"sex"};
}

更多功能请下载demo运行了解使用.

bgfmdb's People

Contributors

carrycn avatar huangzhibiao 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  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  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

bgfmdb's Issues

如果你能写一个使用BGFMDB的demo的话,就更好了。

你的这个BGFMDB像你说的很好用,但是网上一搜索,发现使用你的框架写的demo却一个都没有,即时一个懂FMDB的人,想用您的框架。还要重新学习,比较花费时间。我就是提个建议!望采纳!!!!

插入100条数据有点慢

目前 我有100条model数据 for循环插入要2秒左右的时间 这个太久了 有什么一下子插入100条的数据吗

for (YLHomeCardModel *model in reversedArray) {

            model.updateTime = [Utility currentTimeInterval];
            
            [model bg_saveOrUpdate];
            
            NSLog(@"update name %@ date %@",model.title,model.updateTime);
        }

发现bg_keyPathValues的问题

先看一下二级属性表的结构:
image

现在我匹配到了这个"messageBodyType" : 1
然后,where编出来是这样的:

97eaa19567c8c439b87fe4e5107396f4

多了一个逗号,导致查询失败,问题在于字符串拼接的时候没有考虑该属性位于最后一位,我不懂数据库语言,不清楚是否能直接删除逗号

嗯哼

pod 'BGFMDB', '~> 2.0.2' 在哪呢?

s.name = "BGFMDB"
s.version = "2.0.1"
s.summary = "完美支持iOS大部分类型数据的存储,同时带有 字典转模型 功能模块."

pod 查询不到

pod search BGFMDB
[!] Unable to find a pod with name, author, summary, or description matching BGFMDB

关于字典转模型,有几个小的建议:

最近在使用这个框架,把解析与存储结合起来,非常人性化,
关于字典转模型,有几个小的建议:

1.增加替换变量的功能,如:

(NSDictionary *)mj_replacedKeyFromPropertyName {
return @{@"addressId":@"id"};
}
2.增加一个字典数组转模型数组功能,如-mj_objectArrayWithKeyValuesArray: (解析时可选存储更好)

多线程事务操作

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSLog(@"存储...");
bg_inTransaction(^BOOL{
return [p bg_save];
});
});

这样会出现
The FMDatabase <FMDatabase: 0x6000000a3c60> is currently in use.

按时间删除不能成功

[OTWaitOrderModel bg_deleteFormatSqlConditions:@"where %@ like %@",bg_sqlKey(bg_createTimeKey),@"2017-09-27 19:57:38"];

建议:关于按条件查询的优化&拓展

1、+(NSArray* _Nullable)bg_find:(NSString* _Nullable)tablename where:(NSString* _Nullable)where;
2、+(NSArray*)tansformDataFromSqlDataWithTableName:(NSString*)tableName class:(__unsafe_unretained _Nonnull Class)cla array:(NSArray*)array;
方法1中调用了方法2,但是方法2中的class取的是[self class];
有的时候我会再封装一层manager来管理逻辑方法调用;
这是就造成了方法2返回来的数组中存放的是封装层的类型,而不是模型类型;
如果方法1中同时暴露tablename与class会更灵活,谢谢!

分页查询?

是否提供个分页查询接口,比如 page = 1, count = 10

这个好像取不出来 一直报空的错误

//转换从数据库中读取出来的数据.
+(NSArray*)tansformDataFromSqlDataWithTableName:(NSString*)tableName class:(__unsafe_unretained _Nonnull Class)cla array:(NSArray*)array{
NSMutableArray* arrM = [NSMutableArray array];
for(NSDictionary* dict in array){
id object = [BGTool objectFromJsonStringWithTableName:tableName class:cla valueDict:dict];
[arrM addObject:object];
}
return arrM;
}

在使用 uniqueKeys 是否有編譯順序之差

在 stockModel 裡將 bg_uniqueKeys 移除,會無法再新增相同name的資料
但我在people裡使用 bg_uniqueKeys 可防止重復插入相同name資料
再將 bg_uniqueKeys 移除,也可以再新增相同name的資料

以上這些情況都是發生在已經編譯過之後的再次修改。

在使用 uniqueKeys 是否有編譯順序的差別呢?

关于用cocoapads集成您这个库,只要调用“bg_setDebug,bg_setSqliteName,bg_setDisableCloseDB”方法就报错,不用这几个方法就没问题,各种配置都无效

clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
Undefined symbols for architecture arm64:
"bg_setDebug(bool)", referenced from:
-[TestViewController viewDidLoad] in TestViewController.o
"bg_setDisableCloseDB(bool)", referenced from:
-[TestViewController viewDidLoad] in TestViewController.o
"bg_setSqliteName(NSString*)", referenced from:
-[TestViewController viewDidLoad] in TestViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

关于嵌套基类模型的问题

有这样一种情况:
我存储的ECMessage模型里面有一个ECMessageBody,这个ECMessageBody是作为基类存在的,也就是说真实的情况会是继承自ECMessageBody的ECTextMessageBody,ECVideoMessageBody等等,在存储的时候,存成了ECMessageBody造成了数据的丢失和无法还原.
这个问题该怎么解决呢?

可否将数据库放入Library里?

放在Documents里大部分情况下不会出问题,但如果开发者需要开启app的共享文件夹功能,那么苹果要求Documents里的文件只能是“用户自主下载、导入、创建”的文件,有其他非用户主动产生的文件会被拒审。
以前就遇到过这种情况,百度地图就是把缓存文件方Documents里,导致app新版本开启共享文件夹功能后被拒审,最后得换高德地图,高德地图的缓存文件是放Library里的。

你好,请问我数据库有一个字段是唯一约束,然后在启动配置的时候更新需要根据唯一约束来,然后在其他地方更新其他数据,要根据其他两个约束来,

你好,我的数据库有@“stockId” @"prefix",@"code" 以及其他等字段,开始保存或者更新数据库的时候,根据是否有stockId来判断是否更新或保存,然后进入服务器数据刷新的时候,因为服务器没有返回stockId,只有@"prefix",@"code"和其它数据,所以我就只需要再根据@"prefix",@"code"来进行数据库保存,单个获取保存可以,但是速度慢,我想批量保存数据

比如 //实现该函数,返回指定的 “唯一约束” stockId.
+(NSArray *)bg_uniqueKeys{
return @[@"stockId"];
}

联合主键
+(NSArray *)bg_unionPrimaryKeys{
return @[@"prefix",@"code"];
}

在有联合主键和唯一约束的时候,更新数据里面有唯一约束的时候,更新所有其他数据,没有唯一约束 而更新的时候,希望通过联合主键,忽略唯一约束进行更新 ,怎么批量更新呢?

然后批量根据bg_unionPrimaryKeys更新的时候,出现错误

FMDatabase.m :1177 Unknown error finalizing or resetting statement (19: UNIQUE constraint failed: StockInfoModel.BG_stockId)
报错,请问怎么处理?具体怎么用呢?谢谢

原表数据重新创建表插入数据的问题

还是那个答题类的项目引出的问题:比如50道题,用bg_saveOrUpdateArray方法存储,模型的bg_tableName赋值为@“questionTable”,用户全部答完,答对了40道,错了10道,用户选择交卷以后,进入一个选择结果的界面,该页面有“查看本次对题”,“查看本次错题”的选项,这时如果用户选择查看错题,我需要从原来的表中查询出这10道题,对这10道题再存入一个错题的表中,用于后继的连续性显示的需要,我用的是依然是bg_saveOrUpdateArray这个方法,只不过,这10道题对应的模型的bg_tableName重新赋值为比如叫@“wrongTable”,这时发现wrongTable表创建成功,但是数据无法插入,大概跟了一下,发现是bgdb.m中-(void)bg_saveOrUpdateWithTableName:(NSString* _Nonnull)tablename class:(__unsafe_unretained _Nonnull Class)cla DictArray:(NSArray<NSDictionary*>* _Nonnull)dictArray complete:(bg_complete_B)complete,对于isSave的判断走了([tempDict.allKeys containsObject:bg_id])这个分支,所以最终本来应该是要做的存储操作变成了更新操作,最后wrongTable中始终没有数据。是我没有正确的使用吗?***另外,有没有提供按条件查询属性值的方法,我找了一下,没有找到,比如,我只是单纯地想要查询某一道题题目id为0002的题目对应的答题结果这个属性是答对还是答错,得到一个id类型的值,这时就没有必要查出一条完整的数据。望帮忙指正,谢谢!

+(id)getSqlValue:(id)value type:(NSString*)type encode:(BOOL)encode

if(encode){
return [self jsonStringWithArray:@[value]];
}else{
return [self arrayFromJsonString:value].firstObject; //这里[self arrayFromJsonString:value]返回的不一定是NSArray类型
}

最新版本,BGTool里的这个方法的最后自定义类型的处理貌似不对吧,更新完库以后会导致崩溃

自动刷新表,alert新字段有问题

我增加了一个属性字段,然后我看到在自动检查有没有新字段时有问题,前面一句select table limit 0,1 的返回结果rs.next 的结果一直是no,然后就没有去检查新字段,然后inset就会报没有新字段的错误。

crash

11.2 iphoneX crash in BGTool.m 913 line "-[__NSDictionaryM containsString:]: unrecognized selector" when -beginTransformAction:

关于模拟监听股票数据变化的

问一下,如果再uitableview里面放很多股票,监视股票数据变化,该如何改写呢?定时刷新需要和服务器交互,然后插入数据库再按价格或者其他照规排列,如何动态监听呢?而且频繁插入和读取会卡。怎么优化呢?谢谢

模型属性是可变数组更新的问题

有这样的需求,有一个TestModel,带有10个属性,其中,有一个属性是可变数组,初始化时,可变数组是空数组或者有一个自定义的SubTestModel或者UIImage,但是当用户操作以后,可变数组中需要增加或者删除数个SubTestModel或者UIImage,用bg_update:bg_tablename where:where方法,会数据库报错:near "XXX": syntax error,看了作者的所有方法,没有找到明确的提示,还请作者有时间帮忙看看,因为这种可变数组更新对于那种可选择图片然后离线保存,下一次在提交后台前又可以操作之前离线保存的数据的应用还是很常见的操作。另外,作者辛苦了,佩服作者的开源精神和奉献精神。给你加星了,汗颜我这个拿来主义狗第一次给开源作者加星。

下载下来的Demo字典转模型的时候点击开始转换直接崩溃

在体验Demo的时候,点击开始转换程序直接崩溃,是正常现象吗?下面是打印的崩溃日志:
2018-03-12 21:38:09.977557+0800 BGFMDB[73614:3660519] 调试输出: insert into My(BG_sex,BG_foods,BG_dog,BG_intro,BG_bg_updateTime,BG_bg_createTime,BG_body,BG_name,BG_dogs,BG_bodys) values(?,?,?,?,?,?,?,?,?,?);
2018-03-12 21:38:09.981172+0800 BGFMDB[73614:3660519] 调试输出: select * from My
2018-03-12 21:38:09.983643+0800 BGFMDB[73614:3660519] -[__NSDictionaryM containsString:]: unrecognized selector sent to instance 0x600000234140
2018-03-12 21:38:09.990227+0800 BGFMDB[73614:3660519] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM containsString:]: unrecognized selector sent to instance 0x600000234140'

模型的图片数组存储的bug

模型带一个数组,数组中装的是UIImage,存储报错。然后修改成demo中的UIImage经过UIImageJPEGRepresentation处理后,存储可以了,但是取出后,无法显示,打印是NSConcreteData

死锁问题

在xCode9环境下 存储或批量存储对象会导致死锁

提个建议

BGProtocol协议建议增加类似黑名单 白名单的接口 固定不解析/解析某些属性

  1. 黑名单里的属性不进行存储操作
  2. 如果设置了白名单的属性 则只存储白名单的属性
    因为对于某些固定忽略属性IgnoreKeys每次存储都需要设置 而对于属性很多 但是只更新少量变量的类 �又需要写很多的IgnoreKeys 或者写麻烦的sql语句

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.