【问题标题】:How to retrieve string from NSData stored in sqlite?如何从存储在 sqlite 中的 NSData 中检索字符串?
【发布时间】:2013-04-04 21:02:38
【问题描述】:

注意:

  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 sotred 作为“文本”转换回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);
    }
}

【问题讨论】:

  • strDbData 的类型是什么?是 NSString 吗?
  • 如果数据库中有NSData,那么NSStringstrDbData从哪里来?
  • 是的,那个字符串是从哪里来的?
  • @MartinR 我将 存储在数据库中,并在我想使用时取回并存储在 strDbData 中
  • 请出示代码:strDbData是如何创建的?

标签: ios objective-c ipad nsstring nsdata


【解决方案1】:

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

【讨论】:

    【解决方案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);
        // ...
    

    【讨论】:

    • 你显示的方式是正确的。我对此表示赞赏。但是为什么当我在获取它时打印 myData 时正在打印 。为什么会这样。?此外,当我打印它的类时,它显示 NSConcreteData 而不是 NSData
    • @Bhargavi:这意味着您在数据库中存储了 string "" 而不是二进制数据。因此,您在保存数据的代码中还有另一个问题。也许您可以显示该代码(我已经猜到问题出在哪里了 :-)
    • 我再次编辑了问题。请告诉我我做错了什么
    • 还有一个问题,在 sqlite db 中存储 NSData 二进制或 blob 的字段的数据类型应该是什么?
    • @Bhargavi:我已经更新了答案,希望对您有所帮助。 - 可能是 BLOB,但我不是 100% 确定,请自己尝试。
    【解决方案3】:

    您是否尝试以dataWithContentsOfFile:initWithBytes:length:NSData 方法中的其他方式加载数据。

    一些例子:

    void* bytedata = [self getByteDataByParam:param];
    
    NSData* loadedData = [NSData dataWithBytes:byteData length:length];
    

    【讨论】:

    • 我的数据在数据库中而不是在文件中
    • 很抱歉,好的,但是NSData 有几种方法可以从其他来源创建 NSData:字节、文件等,您是否尝试过 initWithBytes:length: 或其他方法?跨度>
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2010-10-12
    • 2019-07-22
    相关资源
    最近更新 更多