SQLiteDatabase を使って Bitmap 画像を読み書きしてみました。
データ型に、Bitmap 型は存在しないので、Blob 型(バイナリラージオブジェクト)を使用しました。
get/set で Bitmap を読み書きできます。
サンプルソースコード
public class BitmapDB extends SQLiteOpenHelper {
private static final String NAME = "bitmap.db";
private static final int VERSION = 1;
private static final String TABLE = "bitmap";
private static final String _ID = "_id";
private static final String URL = "url";
private static final String BITMAP = "bitmap";
private static final String[] COLUMNS = { _ID, URL, BITMAP };
public BitmapDB(Context context) {
super(context, NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE + " (" //
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT," //
+ URL + " TEXT NOT NULL," //
+ BITMAP + " BLOB NOT NULL" //
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE);
onCreate(db);
}
private synchronized void setCacheAsBlob(String key, byte[] bytes) {
boolean exist = (getCacheAsBlob(key) == null) ? false : true;
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(URL, key);
values.put(BITMAP, bytes);
if (exist) {
db.update(TABLE, values, URL + "=" + "'" + key + "'", null);
} else {
db.insert(TABLE, null, values);
}
db.close();
}
private synchronized byte[] getCacheAsBlob(String key) {
byte[] bytes = null;
final SQLiteDatabase db = getReadableDatabase();
final Cursor cursol = db.query(TABLE, COLUMNS, URL + "=" + "'" + key
+ "'", null, null, null, null);
if (cursol.getCount() == 1) {
if (cursol.moveToFirst()) {
bytes = cursol.getBlob(2);
}
}
cursol.close();
db.close();
return bytes;
}
public Bitmap getBitmp(String url) {
Bitmap bitmap = null;
byte[] bytes = getCacheAsBlob(url);
if (bytes != null) {
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
return bitmap;
}
public void setBitmap(String url, Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100,
byteArrayOutputStream)) {
byte[] bytes = byteArrayOutputStream.toByteArray();
setCacheAsBlob(url, bytes);
}
}
}
大量の画像が存在した場合、任意のファイルを検索して、ファイルで直接読み書きするのと、どちらが高速なんですかね?
もっとよい方法をご存じの方、お待ちしております^^;










