[Android] SQLiteDatabaseを使ってBitmap画像を読み書きする

| トラックバック(0) |

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);
        }
    }

}

 

大量の画像が存在した場合、任意のファイルを検索して、ファイルで直接読み書きするのと、どちらが高速なんですかね?

もっとよい方法をご存じの方、お待ちしております^^;

トラックバック(0)

トラックバックURL: http://mt.adakoda.com/mt-tb.cgi/474

Android Advent Calendar 2011

2012年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29