0

笔记:

  1. 我已经存储NSData在本地数据库中。
  2. 我想从本地数据库中使用它。但由于它以文本形式存储在本地数据库中,因此在将其转换回 NSData.
  3. strDbData 是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本地数据库中的 soret 转换为“文本” 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);
    }
}
4

3 回答 3

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);
    // ...
于 2013-04-12T11:46:34.587 回答
1

您是否尝试从方法中将数据加载为dataWithContentsOfFile:、 或或其他一些。initWithBytes:length:NSData

一些例子:

void* bytedata = [self getByteDataByParam:param];

NSData* loadedData = [NSData dataWithBytes:byteData length:length];
于 2013-04-12T11:42:53.570 回答
-1

您的数据库字段应该是 Blob 而不是 String 类型,这将解决问题

于 2013-04-12T12:33:45.763 回答