【问题标题】:NSData UIImageJPEGRepresentation not writing to SQLite fmdbNSData UIImageJPEGRepresentation 未写入 SQLite fmdb
【发布时间】:2012-01-24 09:37:48
【问题描述】:

我正在尝试将 jpeg 转换为 nsdata 对象,然后使用 fmdb 包装器将该数据存储在 sqlite 数据库的 blob 列中。

例如:

UIImage *img = [UIImage imageNamed:@"house.jpeg" ];
NSData *data = UIImageJPEGRepresentation(img, 1.0);
NSString *query = [NSString stringWithFormat:@"insert into t1 values (null,?)", data ];

t1 的创建位置类似于:

[database executeUpdate:@"create table t1(rowid integer primary key autoincrement, house blob)" ];

理想情况下,我将能够提取数据并将其转换回 jpeg,如下所示:

NSString *query = @"select * from t1";

FMResultSet *results = [database executeQuery:query];

while ([ results next ]) 
{

    NSData *picData = [ results dataForColumn:@"house" ];
    UIImage *housePhoto = [ UIImage imageWithData:picData ];
}

我已经将这种类型的模型用于其他数据类型,如字符串等。没有问题。在我目前的尝试中,我将此模型与字符串列和 1 个 blob 列一起使用。当我写入数据库时​​,所有字符串都存储得很好,但是当我尝试像上面那样读回 blob 列时,我得到了 blob 列的 null 返回。在写入数据库之前,我仔细检查了我正在编写的 NSData 不是 null 并且确实包含 jpeg 表示,并且确实如此。一个已知问题是否会突然出现在任何人身上,或者我只是在外部做错了什么?

【问题讨论】:

  • 您是否检查了生成的 sqlite 数据库以查看是否有任何数据实际存储在列中?这将有助于确定首先写入数据与之后读取数据是否存在问题。您还应该检查以确保UIImageJPEGRepresentation() 返回非nil 值,因为如果图像没有数据或使用不受支持的位图格式,它实际上可能返回nil

标签: objective-c ios sqlite fmdb


【解决方案1】:

这一行:

NSString *query = [NSString stringWithFormat:@"insert into t1 values (null,?)", data ];

总是会产生这个字符串:

insert into t1 values (null,?)

As -stringWithFormat: 不明白您正在尝试将数据绑定到“?”。

看起来 FMDatabase 有一个 -executeQuery: 方法,它接受可变数量的参数。试试这个:

[database executeQuery:@"insert into t1 values (null,?)", data];

如果使用sqlite3手动打开数据库,原始JPEG数据有吗?

警告:我正在访问我大脑中的一个古老部分,因为我已经有几年没有做过数据库了;)

【讨论】:

  • 太棒了!谢谢 :) 你让我开始走上正确的道路。事实证明,您需要调用 executeUpdate 方法并使用变量参数,而不是使用 stringWithFormat 方法提前创建字符串,因为它会给出不正确的查询字符串,正如您所指出的那样。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多