如何从存储在sqlite中的NSData中检索字符串?

时间:2013-04-12 10:58:41

标签: ios objective-c ipad nsstring nsdata

注意:

  1. 我已将NSData存储在本地数据库中。
  2. 我想从本地数据库中使用它。但是因为它存储在 本地数据库作为文本,面临将其转换回来的问题 NSData
  3. strDbData是NSString类型的对象。
  4. 我有一个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);
        }
    }
    

3 个答案:

答案 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类型 这将解决问题

相关问题