ios中使用FMDB的几个小问题
来源:互联网 发布:镜子软件手机版 编辑:程序博客网 时间:2024/06/06 08:56
今天调试BUG,发现几个问题都是对FMDB误用引起的,解决后记录一下:
值为null的列处理
先是通过resultDictionary方法,将ResultSet转换成NSDictionary
1
2
3
4
FMResultSet *rs = [db executeQuery:sql];
while
([rs next]) {
[result addObject:[rs resultDictionary]];
}
然后用objectForKey取出某一列的值,如果该列为空,则返回NSNull,但是判断非空时发生错误:
1
2
3
4
NSString* originFilePath = [row objectForKey:columnName];
// 原始文件路径
if
(originFilePath){
// 非空处理
}
上面的代码是错的,即使此列为空,也会走进非空的分支。要用下面的代码:
1
2
3
4
NSString* originFilePath = [row objectForKey:columnName];
// 原始文件路径
if
((NSNull *)originFilePath != [NSNull
null
]){
// 非空处理
}
拼接SQL时,表名不能是变量
做一个简单的全表查询,返回结果居然是0 row,最后发现表名不能是变量,以下2种写法都是错的
1
FMResultSet *rs = [db executeQuery:@
"select * from %@"
, tableName];
1
FMResultSet *rs = [db executeQuery:@
"select * from ?"
, tableName];
查询参数可以是变量,然后绑定参数,但是表名必须是常量,所以要这么写:
1
2
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类包装一下。以下的代码是错的:
1
FMResultSet *rs = [db executeQuery:sql, latestBackupTime, now];
// latestBackupTime和now是long类型,造成EXC_BAD_ACCESS
应该写成:
1
2
3
long
now = [[NSDate date] timeIntervalSince1970];
// 传给executeQuery()的参数必须是NSObject,不能是原始数据类型,否则报EXC_BAD_ACCESS
FMResultSet *rs = [db executeQuery:sql, [NSNumber numberWithLong:latestBackupTime], [NSNumber numberWithLong:now]];
0 0
- ios中使用FMDB的几个小问题
- ios中使用FMDB的几个小问题
- IOS中FMDB的使用
- iOS中FMDB的使用
- iOS FMDB的使用
- iOS FMDB的使用
- Ios fmdb的使用
- iOS FMDB的使用
- [IOS] ASIHttpRequest库使用过程中发现的几个小问题
- [IOS] ASIHttpRequest库使用过程中发现的几个小问题
- iOS开发中使用FMDB的网文iOS 使用FMDB进行数据库操作
- iOS开发中使用FMDB
- 在ios中使用FMDB
- iOS 数据库fmdb中使用
- IOS -- FMDB的使用心得
- iOS FMDB的简单使用
- iOS开发:FMDB的使用
- iOS开发~FMDB的使用
- Linux负载均衡软件LVS之一(概念篇)
- 集合上的动态规划---最优配对问题
- WebService学习笔记5——AXIS2基础
- js 的全选和反选
- 计算某年某月某日是星期几
- ios中使用FMDB的几个小问题
- Charles使用教程
- Linux负载均衡软件LVS之二(安装篇)
- linux基本常用命令
- ios8 CLLOcationManager 定位与ios7的对比
- gpio和多线程
- task_struct结构
- js特殊字符过滤的示例代码--转自上学吧lhwanglei
- 一张图解释decorator原理