3

最初に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);

これは実際には私のコードのスニペットであり、別の関連する質問に投稿した完全なセクションです。

iPhoneのsqlite dbに一括挿入

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 エントリの最大サイズ内に十分収まっており、データをサイズに合わせて切り取る可能性のある端末に関する情報は見つかりません。

4

2 に答える 2

2

そのバインドの戻り値の型を確認しましたか? エラー コードが返される可能性があります (このイベントでもステートメントは実行される可能性がありますが、間違っているだけです)。

回避策として、ZEROBLOB を作成してから、SQLite ドキュメントに記載されている BLOB I/O ルーチンを使用して書き込みを試みましたか? エラーコードを確認した後、次に試すのはそれです。

于 2010-03-16T04:24:26.107 に答える
0

この乱暴な追跡で加害者を見つけました... 列 0 の代わりに列 1 の値を取得していました。列 0 は、私のデータを含む実際の列でした。クエリへの値のバインドは列 1 から開始されるため、クエリ結果からの列の取得も 1 から開始されると想定しました。私の間違いです。

行あたり 10 バイトは、実際には辞書データではなく、結果の並べ替えに使用していたタイムスタンプです。

于 2010-03-16T08:25:57.003 に答える