如何从存储在sqlite中的NSData中检索字符串? [英] How to retrieve string from NSData stored in sqlite?

查看:123
本文介绍了如何从存储在sqlite中的NSData中检索字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:


  1. 我已存储 NSData 在本地数据库中。

  2. 我想从本地数据库中使用它。但由于它作为文本存储在
    本地数据库中,因此将问题转换回
    NSData

  3. strDbData是 NSString 类型的对象。

  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.

我有一个 NSData 存储在本地数据库中,如< a3829c97 3b1efacb c7680f7e 7e7a95a2>

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)第一种方式

NSData *myData = (NSData*)strDbData;
NSLog(@"%@",[myData class]);

错误: - [__ NSCFString AES256DecryptWithKey:]:无法识别的选择器发送到实例0x1ddcd9c0

2)第二种方式

NSData *myData = [[NSData alloc]initWithData:(NSData*)strDbData];

错误: - [__ NSCFString bytes]:无法识别的选择器发送到实例0x1dd61a40

那么如何将 NSData 转换为本地数据库中的'text'作为'text'返回 NSData

So how do I convert NSData sotred in local database as 'text' back into NSData ?

编辑

strDbData = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 6)];

编辑2 在数据库中存储NSData

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);
    }
}


推荐答案

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

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

这篇关于如何从存储在sqlite中的NSData中检索字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆