最初にNSPropertyListSerializationまたはNSKeyedArchiverのいずれかを介してNSDataに変換することにより、NSMutableDictionariesをsqliteのブロブとして保存しようとしています。
BLOB を保存すると、NSData オブジェクトの長さは数千 (KB 範囲) になります。戻ってくると、10 バイトに切り捨てられています。SQLite ブラウザで DB を確認すると、ほとんどのデータが消えています (辞書を NSPropertyListSerialization として保存すると、レコード内のキーは認識できますが、辞書の値は消えています)。これは、NSPropertyListSerialization または NSKeyedArchiver を使用してデータをシリアル化するかどうかに関係なく発生します。
NSMutableDictionary* item = [items objectAtIndex:i];
NSData *dictionary = [NSKeyedArchiver archivedDataWithRootObject:item];
sqlite3_bind_blob( compiledStatement, 5, [dictionary bytes], [dictionary length], SQLITE_TRANSIENT);
これは実際には私のコードのスニペットであり、別の関連する質問に投稿した完全なセクションです。
gdb または NSLog を使用して [辞書の長さ] の値を確認すると、同じ結果が得られます。データの長さは KB の範囲です。
後でデータの取得を確認すると、次のようになります。
NSData* raw = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 1) length:sqlite3_column_bytes(compiledStatement, 1)];
[raw release];
[生の長さ] を確認すると、わずか 10 バイトしかありません。これは、この列に格納しようとしたデータのすべてのインスタンスに当てはまります。最初のサイズが何であれ、最終的には 10 バイトになります。検索クエリに問題はありません。コマンド ラインと SQL ブラウザーで実行しましたが、正しいレコードと列を取得していますが、この特定の列のレコードに格納されているデータは正しくありません。
残りのデータはどうなりましたか? sqlite3_bind_blob の使用方法に何か問題がありますか? 終了文字または最大サイズ制限については、sqlite のドキュメントを確認しました。私のデータは blob エントリの最大サイズ内に十分収まっており、データをサイズに合わせて切り取る可能性のある端末に関する情報は見つかりません。