如何从存储在sqlite中的NSData中检索string?

注意:

  1. 我已经将NSData存储在本地数据库中。
  2. 我想从本地数据库中使用它。 但是因为它以文本forms存储在本地数据库中,所以在将其转换回NSData遇到问题。
  3. strDbData是NSStringtypes的对象。

我有一个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转换为“文本”转换回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); } } 

如果SQLite列包含二进制数据,您应该通过回读

 const void *bytes = sqlite3_column_blob(statement, 6); int length = sqlite3_column_bytes(statement, 6); NSData *myData = [[NSData alloc] initWithBytes:bytes length:length]; 

而不是把它读入一个string。

要存储二进制数据,请使用“准备好的语句”。 (我没有testing这个代码,我希望它是正确的!)

 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); // ... 

你尝试加载数据dataWithContentsOfFile:initWithBytes:length: ,或从NSData方法的其他一些。

一些例子:

 void* bytedata = [self getByteDataByParam:param]; NSData* loadedData = [NSData dataWithBytes:byteData length:length]; 

你的数据库字段应该是types的Blob而不是String来解决问题