注意:
NSData
存储在本地数据库中。NSData
。NSString
类型的对象。我有一个NSData
存储在本地数据库中,如<a3829c97 3b1efacb c7680f7e 7e7a95a2>
现在我想重新开始,所以我正在按照下面的说法进行操作,但我收到了错误。
1)第一种方式
NSData *myData = (NSData*)strDbData;
NSLog(@"%@",[myData class]);
错误:-[__NSCFString AES256DecryptWithKey:]: unrecognized selector sent to instance 0x1ddcd9c0
2)第二种方式
NSData *myData = [[NSData alloc]initWithData:(NSData*)strDbData];
错误:-[__NSCFString bytes]: unrecognized selector sent to instance 0x1dd61a40
那么如何将本地数据库中的NSData
作为'text'转换回NSData
?
修改
strDbData = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 6)];
编辑2 在数据库中存储NSData
-(BOOL)updateSingleRow:(NSData*)myData
{
@try
{
BOOL success = NO;
sqlite3_stmt *statement;
const char *stmt = [[NSString stringWithFormat:@"UPDATE ABC SET XYZ = '%@' WHERE ID = 1 ",myData] UTF8String];
if (sqlite3_open([databaseFilePath UTF8String], &database) == SQLITE_OK)
{
if(sqlite3_prepare_v2(database, stmt, -1, &statement, NULL) == SQLITE_OK)
{
if(sqlite3_step(statement) != SQLITE_DONE )
{
NSLog( @"updateSingleRow Error: %s", sqlite3_errmsg(database) );
}
else if (sqlite3_total_changes(database)>0)
{
success = YES;
}
else if (sqlite3_total_changes(database)==0)
{
NSLog(@"No Updates : %@" , query);
}
}
sqlite3_finalize(statement);
sqlite3_close(database);
}
return success;
}
@catch (NSException *exception)
{
TRACE_ERROR(@"updateSingleRow", exception.name, exception.description);
}
}
答案 0 :(得分:2)
如果SQLite列包含二进制数据,则应通过
将其读回const void *bytes = sqlite3_column_blob(statement, 6);
int length = sqlite3_column_bytes(statement, 6);
NSData *myData = [[NSData alloc] initWithBytes:bytes length:length];
而不是将其读入字符串。
要存储二进制数据,请使用“预准备语句”。 (我没有测试这段代码,我希望如此 这是对的!)
const char *stmt = "UPDATE ABC SET XYZ = ? WHERE ID = 1";
if (sqlite3_prepare_v2(database, stmt, -1, &statement, NULL) == SQLITE_OK) {
sqlite3_bind_blob(statement, 1, [myData bytes], [myData length], NULL);
// ...
答案 1 :(得分:1)
您是否尝试将数据加载为dataWithContentsOfFile:
或initWithBytes:length:
,或其他来自NSData
方法的数据。
一些例子:
void* bytedata = [self getByteDataByParam:param];
NSData* loadedData = [NSData dataWithBytes:byteData length:length];
答案 2 :(得分:-1)
您的数据库字段应为Blob类型而不是String类型 这将解决问题