今天调试BUG,发现几个问题都是对FMDB误用引起的,解决后记录一下:
值为null的列处理
先是通过resultDictionary方法,将ResultSet转换成NSDictionary
FMResultSet *rs = [db executeQuery:sql];
while ([rs next]) {
[result addObject:[rs resultDictionary]];
}
然后用objectForKey取出某一列的值,如果该列为空,则返回NSNull,但是判断非空时发生错误:
NSString* originFilePath = [row objectForKey:columnName];// 原始文件路径
if (originFilePath){
// 非空处理
}
上面的代码是错的,即使此列为空,也会走进非空的分支。要用下面的代码:
NSString* originFilePath = [row objectForKey:columnName];// 原始文件路径
if ((NSNull *)originFilePath != [NSNull null]){
// 非空处理
}
拼接SQL时,表名不能是变量
做一个简单的全表查询,返回结果居然是0 row,最后发现表名不能是变量,以下2种写法都是错的
FMResultSet *rs = [db executeQuery:@"select * from %@", tableName];
FMResultSet *rs = [db executeQuery:@"select * from ?", tableName];
查询参数可以是变量,然后绑定参数,但是表名必须是常量,所以要这么写:
NSString *sql = [NSString stringWithFormat:@"select * from %@", tableName];
FMResultSet *rs = [db executeQuery:sql];
先提前把sql拼好,传给executeQuery方法的是一个常量
传给executeQuery或者executeUpdate的参数,必须是NSObject
执行一句SQL时,FMDB报EXC_BAD_ACCESS,应用崩溃。在stackoverflow上查到,传给execute方法的参数,必须是NSObject。如果本来是原始数据类型如int,long等,要先用Wrapper类包装一下。以下的代码是错的:
FMResultSet *rs = [db executeQuery:sql, latestBackupTime, now];// latestBackupTime和now是long类型,造成EXC_BAD_ACCESS
应该写成:
long now = [[NSDate date] timeIntervalSince1970];
// 传给executeQuery()的参数必须是NSObject,不能是原始数据类型,否则报EXC_BAD_ACCESS
FMResultSet *rs = [db executeQuery:sql, [NSNumber numberWithLong:latestBackupTime], [NSNumber numberWithLong:now]];
分享到:
相关推荐
此demo使用单例使用FMDB对数据库进行增、删、改、查;demo实现详细
ios数据库sqlite封装,FMDB最新打包,简单方便!
这是一个数据持久化存储库FMDB在Swift工程中使用的一个经典示例!希望对同行有所裨益!
使用fmdb的一个ios demo
关于FMDB的简单曾删改查操作
(FMDB + runtime)数据库操作框架 YUDBFramework
当我们在做一个app的收藏页面或者在面对app的数据库时 十分头疼, 那么我在这为大家提供一个FMDB实列模板 希望对家有帮助,它简化了我对数据库的操作
iOS-基于FMDB的操作封装,模型对象的增删改查 详细使用介绍请参考:http://blog.csdn.net/u014220518/article/details/78189927
基于fmdb的二次封装 实现增删改查 (条件查询,模糊查询)
一个简单的用FMDB实现的ios用户登录Demo
swift 3.0中调用fmdb。 详细代码去github上下载: https://github.com/tom555cat/FMDB-Swift.git
iOS数据库管理—FMDB的使用。详情见链接http://blog.csdn.net/xbenlang/article/details/17955317
http://blog.csdn.net/xyz_lmn/article/details/9312837 iOS学习笔记——数据库操作(使用FMDB)
NULL 博文链接:https://jaybril.iteye.com/blog/1935119
ios 上对sqlite封装的fmdb的基本操作。。
很好的一篇FMDB Demo
iOS 开发 开源代码 数据库 fmdb 工具类
数据库操作FMDB和WCDB的封装,增删查改,和本地搜索,由于文件有点大,上传不了,git代码:https://github.com/greatRong6/DatabaseManager,
使用说明参照我的博客,该文件只作为工具类,并不能直接运行,请将代码copy至项目中具体配置使用
不仅可以处理系统自带的属性字段,还能将模型中的模型转成表数据存储,数据读取与存储直接面向对象:上传的代码是实现源代码不是demo(比较大),大家可以看看,完整demo地址:...