如何通过 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的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SQLCipher 在后台使用 FMDB?

如何将日期+时间保存和检索到 sqlite3 数据库中?

将多个 SQLite 数据库与 FMDB 进行比较

iOS FMDB 无法更新二进制数据的问题

用 FMDB 快速保存 NSI​​mage

FMDB 数据库和 xcode 插入数据库