How to retrieve string from NSData stored in sqlite?

爷,独闯天下 提交于 2019-12-13 06:59:45

问题


Note:

  1. I have stored NSData in local database.
  2. 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.
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!