2013-04-12 49 views
0

注:如何從存儲在sqlite中的NSData中檢索字符串?

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

EDIT 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); 
    } 
} 
+0

是什麼strDbData的類型?它是NSString嗎? –

+1

如果你在數據庫中有NSData,那麼** NSString **'strDbData'是從哪裏來的? –

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

你顯示的方式是正確的。我很欣賞這一點。但爲什麼當我打印myData時,它正在打印<3c613338 32396339 37203362 31656661 63622063 37363830 66376520 37653761 39356132 3e>。爲什麼這樣。?此外,當我打印它的類,它顯示NSConcreteData而不是NSData –

+0

@Bhargavi:這意味着你已經在你的數據庫中存儲**字符串**「」,而不是二進制數據。所以,你在保存數據的代碼中有另一個問題。也許你可以顯示代碼(我已經猜到問題出在哪裏了:-) –

+0

我已經編輯了問題再次。請告訴我我在做什麼錯了 –

1

你嘗試加載數據dataWithContentsOfFile:,或initWithBytes:length:,或從NSData方法的一些東西。

一些示例:

void* bytedata = [self getByteDataByParam:param]; 

NSData* loadedData = [NSData dataWithBytes:byteData length:length]; 
+0

我有數據庫中的數據不在文件 –

+0

我很抱歉,好吧,但'NSData'有幾個方法來創建NSData從其他來源:字節,文件等,你嘗試'initWithBytes:length:'或其他? – Lexandr

+0

+1將我的注意力吸引到了initWithBytes。 –

-1

你的數據庫字段應該類型斑點,而不是字符串 的,這將解決這個問題

+1

它是blob類型的。無論如何,謝謝 –

相關問題