2012-02-24 7 views
0

問題: - 私はFMDatabaseクラスを使用してデータをデータベースに格納し、dbからデータにアクセスしています。あるテーブルでは、Imageを格納するためにBlobデータ型を使用しました。 方法:Feitingイメージフォームsqlite(FMDatabaseクラスを使用)

 UIImage *img = [UIImage imageNamed:@"image.png"]; 
    NSData *data = UIImagePNGRepresentation(img); 
    [fmdbase executeUpdate:[NSString stringWithFormat: @"Insert into tblComm('%d,%@','%@')",cID,cmmentsString,data...]]; 

そして、このようなデータにアクセスし、

 commentsText.text = [records stringForColumn:@"comments"]; 
    // NSData *data = [records stringForColumn:@"photo"]; 
     NSData *data = [records dataForColumn:@"photo"]; 
    UIImage *img = [UIImage imageWithData:data]; 

が、データが正確なフォーマットや画像を表示していないではありません、助けてください?

+1

解決方法:次のようにします。テーブルtblComm(commID integerプライマリキーオートインクリメント、通信テキスト、写真テキスト)を作成します。 BASE64Encodingを使用してFMDatabaseクラスを使用して値を挿入するには、このリンクからコードをダウンロードしてください(http://imthi.com/blog/programming/iphone-sdk-base64-encode-decode.php)。このようなコードを記述してください:// nsdataをnsstringに変換する:UIImage * img = [UIImage imageNamed:@ "image.png"]; data1 = UIImagePNGRepresentation(img); [Base64の初期化]。 NSString * enString = [Base64エンコード:データ1]; –

答えて

1

システムでファイルにイメージを書き込み、そのパス(または他の種類の識別子)をデータベースに格納するという選択肢が1つあります。

sqliteがレコードを保存する方法のいくつかの内部で、&が画像の保存に最適化されていない可能性があります。 Appleの勧告は、〜2キロバイトを超えるSQLiteデータベースにBLOBを格納することではありません。

SQLiteはデータベースをページに編成します。各ページのサイズは4キロバイトです。 SQLiteデータベースファイルからデータを読み込むと、これらのページが内部ページキャッシュにロードされます。 iPhoneの場合、このキャッシュのデフォルトは1メガバイトです。これにより、おそらくページキャッシュに既に存在するため、隣接するレコードを非常に高速に読み取ることができます。

SQLiteがデータベースレコードをメモリに読み込むと、レコード全体とそれが占めるすべてのページが読み込まれます。したがって、レコードにBLOBが含まれている場合は、多くのページを占有する可能性があり、既存のページをキャッシュから取り出してBLOBレコードのページに置き換えます。

BLOBSをスキャンしてBLOBを読み込んで、何かを行う(たとえば、表示する)だけであれば、それほど悪くはありません。しかし、BLOBと同じ行にあるデータを取得したいというクエリを実行したとすると、このクエリはレコードに大きなBLOBが含まれていない場合よりもはるかに遅くなります。ですから、BLOBデータを別のテーブルに格納する必要があります。または、私の最初の提案があったように、BLOBデータをSQLiteデータベースの外部にファイルとして格納する方がよいでしょう。

ページキャッシュのサイズをSQL PRAGMA statements(CoreDataを使用していない場合)と微調整することができます。

関連する問題