我想为 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,这为我提供了空字符串。
请仔细研究一下。
提前致谢
答案 0 :(得分:1)
数据从未正确插入数据库。原因是查询sqlite3始终采用UTF8的形式。必须将NSString转换为UTF-8才能进行查询。在此转换之后,存储在数据库中的NSData完全改变,即通过UTF-8再次编码。
当我检索数据时,它与旧数据不同。因此,在取消归档时会出错。
解决方案:将NSData存储到sqlite3而不转换为UTF-8,并使用 sqlite_bind_blob 将blob数据存储到sqlite3数据库。