2016-11-09 15 views
1

辞書の応答を取得する)NSDataの 2として保存します私の場合はうまくいくでしょう。 retrive は <p>何もNSKeyedUnarchiver</p>で試してみました)NSStringの 3として保存)sqliteは、完全なJSONレスポンスデータを(辞書)を挿入し、私は 1のような複数のソリューションを試してみました

sqliteの

- (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; 
} 
からのデータを保存および取得のために添付のJSONデータ

コードをチェックしてください - 私は私のコントローラ

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

ガイに使用しています

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

コード私が持っています何度も試してみましたが、まだ問題に直面しています。この問題を解決するための解決策を提供してください。

+0

デバッガを使用してこのコードを実行しましたか?実行パスはあなたの期待通りですか?実際に何が起こっているのかについての詳細を提供していないので、誰も本当に助けることはできません。 – rmaddy

+0

はい私はすべてのステップでデバッグを行いますが、私は私のjsonデータを保存したいので、後で私はそれらを取得して使用できると言います。 NSDataは完全に追加されましたが、取得時にnull値を表示していますので、コードが間違っています。他に何を説明する必要がありますか? –

+0

投稿したコードが実際にあなたが期待していることをしているかどうか尋ねます。 1行ずつステップスルーします。各行は期待どおりに動作しますか?各行は適切な結果を出していますか? NSDataが完全に追加されたことをどのように知っていますか? – rmaddy

答えて

0

コードには多くの問題があります。しかし、問題の主な原因は、valueArr列の列インデックス番号です。データを読み取ろうとすると、間違ったインデックスが使用されます。

あなたのクエリは次のとおりです。bookDetailsから

選択bookID、bookName、bookTitleで、valueArr

bookdIDがインデックス0であるとvalueArrがインデックス3 sqlite3_column_xxx機能のすべてをゼロベースのインデックスを使用していますsqlite3_bind_xxx関数のすべてが1つのインデックスを使用しています。

このライン:

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"];これは大丈夫ですか? –

関連する問題