存储和检索NSAttributedString

时间:2014-10-01 06:00:03

标签: objective-c sqlite nsdata nsattributedstring

我想为 UITextView的NSAttributedString 存储我的Rich Text。对于stackoverflow问题中的建议,我选择 NSData 。问题是应用程序崩溃,而取消归档和检索的数据也与保存的NSData不同。

解释 DB: 将数据保存到数据库

在DB中我有一个名为rtfText的列,其数据类型为 blob - > (rtfText blob) 保存到DB时,我这样做

NSData *data = [NSKeyedArchiver archiveWithRootObject:_myTextView.attributedString];

并在查询中发送这样的数据

NSString Query = [NSString stringWithFormat:@"Insert into table (rtfText) VALUES \"%@\")",data];

从数据库中检索数据

按如下方式检索数据:

NSData *data = [[NSData alloc] initWithBytes:(sqlite3_column_blob(statement, 18)) length:sqlite3_column_bytes(statement, 18)];

取消存档:

从DB中检索到的NSData中,我将其解压缩为NSAttributedString,就像这样

_myTextView.attributedText = [NSKeyedUnarchiver unarchiveObjectWithData:data];  **<- App Crashes at this point giving error**

错误: - [__ NSCFData objectForKey:]:无法识别的选择器发送到实例0x15d56e80

我甚至尝试在归档后将NSAttributedString保存到NSData,然后使用NSASCIIStringEncoding将其转换为NSString,但数据库崩溃。我也尝试过像这样保存它。首先使用NSKeyedArchiver将NSAttributedString转换为NSData,然后使用NSUTF8StringEncoding将NSString转换为NSString,这为我提供了空字符串。

请仔细研究一下。

提前致谢

1 个答案:

答案 0 :(得分:1)

数据从未正确插入数据库。原因是查询sqlite3始终采用UTF8的形式。必须将NSString转换为UTF-8才能进行查询。在此转换之后,存储在数据库中的NSData完全改变,即通过UTF-8再次编码。

当我检索数据时,它与旧数据不同。因此,在取消归档时会出错。

解决方案:将NSData存储到sqlite3而不转换为UTF-8,并使用 sqlite_bind_blob 将blob数据存储到sqlite3数据库。