如何通过 FMDB 将数据保存和检索到 sqlite
Posted
技术标签:
【中文标题】如何通过 FMDB 将数据保存和检索到 sqlite【英文标题】:How to save & retrieve NSdata into sqlite through FMDB 【发布时间】:2014-03-06 19:35:28 【问题描述】:如何将NSData
保存到 sqlite,我正在使用 FMDB 包装器来保存数据。
以下是我目前尝试过的代码 为了节省
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model.expertArray];;
NSString *query = [NSString stringWithFormat:@"insert into save_article values ('%@','%@','%@','%@','%@','%@')",
model.Id, model.title, model.earliestKnownDate, data, model.excerpt,model.image_url];
用于检索
while([results next])
NSData *data = [results dataForColumn:@"experts"];
NSMutableArray *photoArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
我已经尝试过 blob 和 text 这两种数据类型,但到目前为止都没有运气,谁能指导我怎么做?
【问题讨论】:
一般 NSData 应该存储为 blob。而且,对于 blob,您几乎必须使用绑定参数。否则(非 ASCII)blob 数据将导致生成损坏的插入语句。 我也尝试过使用 blob,但这不起作用 (顺便说一句,如果您以这种方式构建语句,您并没有真正使用 FMDB,那么您只能解决它。) 必须使用绑定参数。只需插入带有stringWithFormat
的 blob 就会导致 SQL 语句损坏。
你能举出绑定参数的例子吗?
【参考方案1】:
以下是使用 FMDB 将 NSData
插入 Sqlite 时可能面临相同问题的所有人的代码段。
就我而言,我想将NSArray
存储在Sqlite
中,所以我首先将NSArray
转换为NSData
,然后将其存储在Sqlite
中。
将 NSArray 转换为 NSData
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:YourNSarray];;
将 NSData 保存到 Sqlite
[database executeQuery:@"insert into save_article values (?,?,?,?,?,?)", model.Id, model.title, model.earliestKnownDate, data, model.excerpt,model.image_url];
注意:-不要使用stringWithFormat
[下面是你不应该使用的代码]:构建查询。感谢@rmaddy 和@hotlicks 向我指出这个:)
NSString *query = [NSString stringWithFormat:@"insert into user values ('%@', %d)",
@"brandontreb", 25];
[database executeUpdate:query];
现在是最后一步,即将 NSData 检索回 NSArray
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:[database dataForColumn:@"yourcololumname"]];
希望这对有需要的人和初学者有帮助:)
【讨论】:
什么是“数据”列数据类型? 对数据列使用 blob 好的。我得到了它。谢谢你的回答。 @DAMM108 我已经尝试过了,但它对我不起作用,即使我有数据类型 blob。您是否可以提供更多说明?另外,你不认为查询应该是这样的 Insert into user (coulmn1, 2,3) values(?,?,?)" ...【参考方案2】:不要使用stringWithFormat:
构建查询。这是一个坏主意,有几个原因。
使用executeQuery
方法为每个要绑定到查询的值添加?
。
类似这样的:
[database executeQuery:@"insert into save_article values (?,?,?,?,?,?)", model.Id, model.title, model.earliestKnownDate, data, model.excerpt,model.image_url];
【讨论】:
我应该使用哪种数据类型然后是 blob 或 text 对NSData
使用blob。
@rmaddy,能否详细说明不使用 stringWithFormat 的原因?
@EricChuang 问题是如果您使用stringWithFormat:
,值可能包含未正确转义的特殊字符。这会导致错误和崩溃。它还可能导致 SQL 注入攻击(如果您不知道该词是什么,请搜索该词)。通过正确绑定值,您可以消除所有这些问题。
@Hemang 最好的解决方案是在 SQL 中列出列名:INSERT INTO table_name (col1, col2, col3) VALUES (?, ?, ?)
。然后应该按照INSERT
语句中列出的顺序传递值。以上是关于如何通过 FMDB 将数据保存和检索到 sqlite的主要内容,如果未能解决你的问题,请参考以下文章