2016-11-09 9 views
1

我與像 1多個溶液試圖檢索)除NSData的 2)除的NSString 3)試圖與NSKeyedUnarchiver想要SQLite中插入完整的JSON響應數據(字典)中並用字典響應

沒什麼將在我的情況下工作。檢查連接JSON數據

代碼從源碼

- (BOOL)saveBookData:(NSString *)bookID bookName:(NSString*)bookNames bookTitle:(NSString*)bookTitle valueArr:(NSDictionary *)valueArr 
    { 
    const char *dbpath = [databasePath UTF8String]; 
    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
    { 
    NSData *theDictionaryData = [NSKeyedArchiver archivedDataWithRootObject:valueArr]; 
    NSString *insertSQL = [NSString stringWithFormat:@"insert into bookDetails(bookID, bookName, bookTitle, valueArr) values (\"%@\",\"%@\", \"%@\", \"%@\")",bookID,bookNames,bookTitle, theDictionaryData]; 
    const char *insert_stmt = [insertSQL UTF8String]; 

    sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL); 

    // sqlite3_bind_text(statement, 1, [bookID UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(statement, 2, [bookNames UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(statement, 3, [bookTitle UTF8String], -1, SQLITE_TRANSIENT); 
    //sqlite3_bind_text(statement, 4, [valueArr UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_blob(statement, 4, (__bridge const void *)(theDictionaryData) , -1, SQLITE_TRANSIENT); 



    if (sqlite3_step(statement) == SQLITE_DONE) 
    { 
     return YES; 
    } 
    else { 
     return NO; 
    } 
    //sqlite3_reset(statement); 
} 
return NO; 
} 

retrive保存和檢索數據 -

-(NSMutableArray*)findAllBook 
{ 
resultArray = [[NSMutableArray alloc] init]; 

sqlite3 *database2; 

if(sqlite3_open([databasePath UTF8String], &database2) == SQLITE_OK) 
{ 

    NSString *sqlStatement_userInfo =[NSString stringWithFormat:@"Select bookID, bookName, bookTitle, valueArr from bookDetails"]; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database2, [sqlStatement_userInfo UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 
     while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
     { 
      NSMutableDictionary *_dataDictionary2=[[NSMutableDictionary alloc] init]; 

      NSString *_savePdfID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
      NSString *_savePdfName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
      NSString *_savePdfText = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 
      // NSString *_savePdfDetails = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 
      NSData *retrieveData = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 4) length:sqlite3_column_bytes(compiledStatement, 4)]; 

      //NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:retrieveData]; 
      //NSLog(@"dict data is %@",dictionary); 

      [_dataDictionary2 setObject:[NSString stringWithFormat:@"%@",_savePdfID] forKey:@"savedBOOKID"]; 
      [_dataDictionary2 setObject:[NSString stringWithFormat:@"%@",_savePdfName] forKey:@"savedBOOKName"]; 
      [_dataDictionary2 setObject:[NSString stringWithFormat:@"%@",_savePdfText] forKey:@"savedBOOKText"]; 
      [_dataDictionary2 setObject:retrieveData forKey:@"savedBOOKDetail"]; 

      [resultArray addObject:_dataDictionary2]; 
     } 
    } 
    else 
    { 

    } 
    // Release the compiled statement from memory 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database2); 

return resultArray; 
} 

碼,我用我的控制器

NSLog(@"%@",[[PDFManager getSharedInstance]findAllBook]); 
NSMutableArray *arr = [[[PDFManager getSharedInstance]findAllBook]valueForKey:@"savedBOOKDetail"]; 
NSLog(@"%@",arr); 
NSMutableDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:[arr objectAtIndex:0]]; 
NSLog(@"%@",dictionary); 

蓋伊我有嘗試多次,但仍然面臨問題時總是得到空值回收時,您可以請提供一些解決方案來解決這個問題。

+0

你有沒有使用調試器通過這段代碼?執行路徑是你期望的嗎?由於你沒有提供任何實際發生的細節,所以沒有人能真正幫助你。 – rmaddy

+0

是的,先生我調試每一步,我期望我提到我想保存我的JSON數據,以便我可以檢索和使用它們。 NSData完美添加,但它在檢索時顯示空值,所以我在代碼中是錯誤的我還應該解釋什麼? –

+0

我問你發佈的代碼是否真的在做你期望的。逐行進行。每條生產線是否按預期運行?每一行是否給出正確的結果?你怎麼知道'NSData'被完美添加? – rmaddy

回答

0

你的代碼有很多問題。但是,您的問題的主要原因是您的valueArr列的列索引號。當您嘗試讀取數據時,您使用錯誤的索引。

您所查詢的是:

選擇BOOKID,BOOKNAME,BOOKTITLE,從bookDetails valueArr

bookdID是索引0 valueArr是指數3.所有的sqlite3_column_xxx功能使用從零開始的索引儘管所有的sqlite3_bind_xxx函數都使用基於一個索引。

這條線:

NSData *retrieveData = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 4) length:sqlite3_column_bytes(compiledStatement, 4)]; 

需要是:

NSData *retrieveData = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 3) length:sqlite3_column_bytes(compiledStatement, 3)]; 

除此之外,您需要解決所有的問題在你的saveBookData方法。如果數據庫已打開,則不要關閉該數據庫。準備報表時,您不要做任何錯誤檢查。如果準備好了,你還沒有最終確定。您的findAllBook更好,但它仍然有問題。即使數據庫沒有打開,您也可以關閉該數據庫。即使它沒有準備好,你最終確定了該聲明。當任何錯誤檢查失敗時,您應該添加對sqlite3_errmsg的調用,以便知道失敗的原因。

+0

感謝哥們,指數值我忘了改變,但我使用3,我得到NSData(<3c363237 30366336 39203733 37343330)。下面一行總是給出空值。 [NSKeyedUnarchiver unarchiveObjectWithData:[arr objectAtIndex:0]] –

+0

'[arr objectAtIndex:0]'已經是一個字典。你爲什麼試圖解開它? – rmaddy

+0

不,這是字典存檔數據。所以在獲取數據後,我必須取消存檔以獲取詳細信息。 NSMutableArray * arr = [[[[PDFManager getSharedInstance] findAllBook] valueForKey:@「savedBOOKDetail」];這很好嗎? –