问题
Note:
- I have stored
NSData
in local database. - I want to use it back from local database. But as it is stored in
local database as text ,facing issue in converting back it into
NSData
. - strDbData is object of type
NSString
here.
I have one NSData
stored in local database like <a3829c97 3b1efacb c7680f7e 7e7a95a2>
Now I want to retrive it back, so I am doing as mentioned below but I am receiving error.
1) First way
NSData *myData = (NSData*)strDbData;
NSLog(@"%@",[myData class]);
Error : -[__NSCFString AES256DecryptWithKey:]: unrecognized selector sent to instance 0x1ddcd9c0
2) Second way
NSData *myData = [[NSData alloc]initWithData:(NSData*)strDbData];
Error: -[__NSCFString bytes]: unrecognized selector sent to instance 0x1dd61a40
So how do I convert NSData
sotred in local database as 'text' back into NSData
?
EDIT
strDbData = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 6)];
EDIT 2 Storing NSData in database
-(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);
}
}
回答1:
If the SQLite column contains binary data, you should read it back via
const void *bytes = sqlite3_column_blob(statement, 6);
int length = sqlite3_column_bytes(statement, 6);
NSData *myData = [[NSData alloc] initWithBytes:bytes length:length];
instead of reading it into a string.
To store binary data, use a "prepared statement". (I did not test this code, I hope that it is correct!)
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);
// ...
回答2:
Did you try load data as dataWithContentsOfFile:
, or initWithBytes:length:
, or some else from NSData
methods.
Some example:
void* bytedata = [self getByteDataByParam:param];
NSData* loadedData = [NSData dataWithBytes:byteData length:length];
回答3:
Your Database Field should of type Blob instead of String that will solve the problem
来源:https://stackoverflow.com/questions/15969598/how-to-retrieve-string-from-nsdata-stored-in-sqlite