22

現在、sを完全に読み書きするSQLiteDBをセットアップしましたNSString。また、画像をデータベースに保存して、後で呼び出したいと思います。画像の使用とエンコードについて少し読みましたNSDataが、自分がやりたいことの構文が何であるか完全にはわかりません。コードスニペットや例をいただければ幸いです。

私の現在のプロセスは次のようになります: UIImagePickerController->ユーザーが写真から画像を選択->selectedImageがインスタンスに設定されているUIImageView->この画像を取得してDBに保存したい

この呼び出しは、最終的にはリモートサーバーへの呼び出しに置き換えられることに注意してください。パフォーマンスに関しては、これが違いを生むかどうかはわかりません。

4

6 に答える 6

31

UIImageView 内でホストされている UIImage を、SQLite に格納するためのバイナリ BLOB に変換する必要があります。これを行うには、次を使用できます。

NSData *dataForImage = UIImagePNGRepresentation(cachedImage);
sqlite3_bind_blob(yourSavingSQLStatement, 2, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT);

これにより、画像の PNG 表現が生成され、それが NSData インスタンスに格納され、NSData からのバイトが SQL クエリの 2 番目の引数の BLOB としてバインドされます。必要に応じて、上記の UIImageJPEGRepresentation を使用してその形式で保存します。SQLite データベースの適切なテーブルに BLOB 列を追加する必要があります。

この画像を取得するには、次を使用できます。

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
于 2009-03-13T17:41:13.330 に答える
9

1 つのオプション (SQL で作業する場合に一般的に好まれる) は、イメージをシステム上のファイルに書き込み、パス (またはその他の種類の識別子) をデータベースに保存することです。

于 2009-03-13T17:32:29.340 に答える
9

Apple の推奨事項は、2 キロバイトを超える SQLite データベースに BLOB を保存しないことです。

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

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

これは、すべての BLOB をスキャンして読み込んで何かを行う (たとえば、表示する) だけであれば、それほど悪くはありません。しかし、BLOB と同じ行にあるデータを取得するだけのクエリを実行した場合、このクエリは、レコードに大きな BLOB が含まれていない場合よりもはるかに遅くなります。

したがって、少なくとも BLOB データを別のテーブルに格納する必要があります。例えば:

CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER, 
    FOREIGN KEY(blob_id) REFERENCES blobs(id) );

または、BLOB データを SQLite データベースの外部にファイルとして保存することをお勧めします。

(CoreData を使用していない場合) SQL PRAGMA ステートメントを使用してページ キャッシュ サイズを微調整できる場合があることに注意してください。

于 2011-04-15T10:21:56.957 に答える
2

イメージを SQLite DB に書き込む

if(myImage != nil){
    NSData *imgData = UIImagePNGRepresentation(myImage);
    sqlite3_bind_blob(update_stmtement, 6, [imgData bytes], [imgData length], NULL);    
    }
    else {
        sqlite3_bind_blob(update_stmtement, 6, nil, -1, NULL);
    }

SQLite DB からの読み取り:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(init_statement, 6) length:sqlite3_column_bytes(init_statement, 6)];
        if(data == nil)
            NSLog(@"No image found.");
        else
            self.pictureImage = [UIImage imageWithData:data];   
于 2010-01-29T13:05:41.263 に答える
0

ベスト プラクティスは、イメージを圧縮してデータベースまたはファイル システムに格納することです。画像の解像度を気にしない場合は、次を使用して画像のサイズを変更することもできます。

   UIGraphicsBeginImageContext(newSize);  
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];   
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();    
   UIGraphicsEndImageContext();

その後、UIImageJPEGRepresentation最大圧縮の値「0」の jpeg 画像に使用できます。UIImagePNGRepresentationまたは、png画像に使用できます

于 2012-07-05T12:21:48.507 に答える
0

最初にファイルシステムにイメージを書き込む必要があります。次に、画像パスを取得し、その画像パス(URL)をTEXTとしてsqliteに保存します。

于 2015-05-27T07:08:01.577 に答える