If you want to store large images (full-screen), it's advisable to
store only the file path in the database, having said that, let's
answer your question:

1. Define the column that holds the image as BLOB.
2. To make sure you are not storing duplicate images, store the hash-
code of the image along with the image (I'll get to that later)
3. So, it's a good idea to create a table that holds only the images,
and use reference to this table from other tables.
4. To create the table you can use code similar to the following:

db.execSQL("CREATE TABLE images ("
        + "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
        + "data BLOB,"
        + "hash BLOB UNIQUE"
        + ");");

5. May I suggest that you store your table name and column names in
predefined constants, and use a StringBuilder to build SQL queries,
instead of concatenating strings to prevent unnecessary garbage
collection :-)

6. To convert the image to a BLOB, use the following code: (Note that
we're compressing the image here)

private byte[] getBitmapAsByteArray(Bitmap bitmap) {
   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

   // Middle parameter is quality, but since PNG is lossless, it
doesn't matter
   bitmap.compress(CompressFormat.PNG, 0, outputStream);
   return outputStream.toByteArray();
}

7. To read this data from the database, you will do something like:
byte[] bitmapData = cursor.getBlob(cursor.getColumnIndex("data"));

8. To convert this data back to an image, use:
BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length);

9. Basically that already answers your question, but I promised you
the image hash-code, so here goes:
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(bitmapData); // It's the same bitmap data that you got from
getBitmapAsByteArray
byte[] digest = md.digest();

10. Like you could see from the table creation, this is also stored as
a BLOB.

11. If you want to query the hash code (Probably to see if an image
with the hash hash, already exists(, you cannot use the blob in a
SELECT statement, you must convert the hash blob to a blob-string (in
the form of x'abcde...', with the following code:

private static char toHexDigit(int b) {
   return (char)((b < 10) ? ('0' + b) : ('A' + b - 10));
}

public static String toBlobString(byte[] bytes) {
   final int length = bytes.length;
   char chars[] = new char[length * 2 + 3];
   chars[0] = 'x';
   chars[1] = '\'';
   int index = 2;
   for (int n = 0; n < length; n++) {
     int value = bytes[n] & 0xff;
     chars[index++] = toHexDigit(value / 16);
     chars[index++] = toHexDigit(value % 16);
  }

  chars[index] = '\'';
  return new String(chars);
}

Regards,
Lior - Developer of UltimateFaves / UltimateFavesPRO

http://ultimatefaves.wordpress.com/
https://mobentoo.com/application/ultimate-faves-pro



This is what I do and it works very well,

On Nov 4, 7:40 am, devi <devi.n...@gmail.com> wrote:
> hi!
>
>            I want to store Images(using insert statement) in sqlite
> database & retrive that image from database and display that image on
> android emulator...can anyone give sample code?

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to