0

how do i retrive image from sql lite?this code is work fine for small size image wheni used heavy jpg image is not display what do i do? i found solution decode image but where i place that code? below is my full source code

  public class SQLiteDemoActivity extends Activity {




  ArrayList<Contact> imageArry = new ArrayList<Contact>();
  ContactImageAdapter adapter;
  Button BrowseButton;
 Button BrowseButton2;
 DataBaseHandler db;





   ByteArrayOutputStream stream = new ByteArrayOutputStream();
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   db = new DataBaseHandler(this);
   //get image from drawable




   BrowseButton=(Button)findViewById(R.id.BrowseButton);
   BrowseButton2=(Button)findViewById(R.id.BrowseButton2);

   adapter = new ContactImageAdapter(this, R.layout.screen_list,    imageArry);

   BrowseButton.setOnClickListener(new View.OnClickListener() {

    @Override
   public void onClick(View v) {



    Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.my);


    image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] imageInByte = stream.toByteArray();

    Log.d("Insert: ", "Inserting ..");
    db.addContact(new Contact("FaceBook", imageInByte));
    //display main List view bcard and contact name

    //Reading all contacts from database

  //        

   }
   });

     BrowseButton2.setOnClickListener(new View.OnClickListener() {

   @Override
   public void onClick(View v) {


    List<Contact> contacts = db.getAllContacts();
    for (Contact cn : contacts) {




    String log = "ID:" + cn.getID() + " Name: " + cn.getName()      + " ,Image: " +  
     cn.getImage();


    //Writing Contacts to log
    Log.d("Result: ", log);
    //add contacts data in arrayList
    imageArry.add(cn);

    }

    ListView dataList = (ListView) findViewById(R.id.list);
    dataList.setAdapter(adapter);

    try {
        stream.close();
        stream = null;
    } catch (IOException e) {

        e.printStackTrace();
    }

  }
    });

  }








        public class Contact {

// private variables
int _id;
String _name;
byte[] _image;

// Empty constructor
public Contact() {

}

// constructor
public Contact(int keyId, String name, byte[] image) {
this._id = keyId;
this._name = name;
this._image = image;

}

// constructor
public Contact(String contactID, String name, byte[] image) {
this._name = name;
this._image = image;

}

// constructor
public Contact(String name, byte[] image) {
this._name = name;
this._image = image;
}

// getting ID
public int getID() {
return this._id;
}

// setting id
public void setID(int keyId) {
this._id = keyId;
}

// getting name
public String getName() {
return this._name;
}

// setting name
public void setName(String name) {
this._name = name;
}

// getting phone number
public byte[] getImage() {
return this._image;
}

// setting phone number
public void setImage(byte[] image) {
this._image = image;
}
}





       public class ContactImageAdapter extends ArrayAdapter<Contact>{
      Context context;
     int layoutResourceId;
   //BcardImage data[] = null;
    ArrayList<Contact> data=new ArrayList<Contact>();
    public ContactImageAdapter(Context context, int layoutResourceId,  
    ArrayList<Contact>  
      data) {
   super(context, layoutResourceId, data);
  this.layoutResourceId = layoutResourceId;
   this.context = context;
   this.data = data;
   }

    @Override
   public View getView(int position, View convertView, ViewGroup parent) {
   View row = convertView;
   ImageHolder holder = null;
   if(row == null)
   {
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
   row = inflater.inflate(layoutResourceId, parent, false);
   holder = new ImageHolder();
   holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
   holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
   row.setTag(holder);
    }
   else
  {
   holder = (ImageHolder)row.getTag();
    }
   Contact picture = data.get(position);
   holder.txtTitle.setText("facebook");
   //convert byte to bitmap take from contact class
    byte[] outImage=picture._image;
   ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
   Bitmap theImage = BitmapFactory.decodeStream(imageStream);
    holder.imgIcon.setImageBitmap(theImage);
   return row;
    }
   static class ImageHolder
   {
  ImageView imgIcon;
  TextView txtTitle;
   }
  }









        import java.util.ArrayList;
       import java.util.List;

          import android.content.ContentValues;
      import android.content.Context;
     import android.database.Cursor;
      import android.database.sqlite.SQLiteDatabase;
       import android.database.sqlite.SQLiteOpenHelper;

       public class DataBaseHandler extends SQLiteOpenHelper {

     //All Static variables
      //Database Version
      private static final int DATABASE_VERSION = 1;

      //Database Name
       private static final String DATABASE_NAME = "imagedb";

     //Contacts table name
     private static final String TABLE_CONTACTS = "contacts";

   //Contacts Table Columns names
     private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
   private static final String KEY_IMAGE = "image";

    public DataBaseHandler(Context context) {
     super(context, DATABASE_NAME, null, DATABASE_VERSION);
     }

   //Creating Tables
     @Override
       public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
    + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
    + KEY_IMAGE + " BLOB" + ")";
   db.execSQL(CREATE_CONTACTS_TABLE);
       }

    //Upgrading database
      @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //Drop older table if existed
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

   //Create tables again
    onCreate(db);
     }

     /**
     * All CRUD(Create, Read, Update, Delete) Operations
       */

      public// Adding new contact
     void addContact(Contact contact) {
     SQLiteDatabase db = this.getWritableDatabase();

      ContentValues values = new ContentValues();
   values.put(KEY_NAME, contact._name); // Contact Name
     values.put(KEY_IMAGE, contact._image); // Contact Phone

    //Inserting Row
    db.insert(TABLE_CONTACTS, null, values);
    db.close(); // Closing database connection
   }

      //Getting single contact
     Contact getContact(int id) {
     SQLiteDatabase db = this.getReadableDatabase();

   Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
      KEY_NAME, KEY_IMAGE }, KEY_ID + "=?",
   new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
   cursor.moveToFirst();

   Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
   cursor.getString(1), cursor.getBlob(1));

    //return contact
     return contact;

     }

    //Getting All Contacts
      public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<Contact>();
   //Select All Query
    String selectQuery = "SELECT * FROM contacts ORDER BY name";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
  //looping through all rows and adding to list
    if (cursor.moveToFirst()) {
   do {
  Contact contact = new Contact();
  contact.setID(Integer.parseInt(cursor.getString(0)));
  contact.setName(cursor.getString(1));
  contact.setImage(cursor.getBlob(2));
  //Adding contact to list
  contactList.add(contact);
  } while (cursor.moveToNext());
  }
     //close inserting data from database
    db.close();
     //return contact list
     return contactList;

      }

   //Updating single contact
    public int updateContact(Contact contact) {
     SQLiteDatabase db = this.getWritableDatabase();

   ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.getName());
    values.put(KEY_IMAGE, contact.getImage());

//updating row
   return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
  new String[] { String.valueOf(contact.getID()) });

      }

 //Deleting single contact
   public void deleteContact(Contact contact) {
  SQLiteDatabase db = this.getWritableDatabase();
   db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
  new String[] { String.valueOf(contact.getID()) });
    db.close();
 }

 //Getting contacts Count
     public int getContactsCount() {
   String countQuery = "SELECT * FROM " + TABLE_CONTACTS;
 SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
     cursor.close();

  //return count
   return cursor.getCount();
  }






    <------ from where i used this function------------->




              private Bitmap decodeFile(File f) {
        try {
            // decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 <  
          REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale++;
            }

            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null,  
    o2);
        }
        catch (FileNotFoundException e) {
        }
        return null;
    }
hayya anam
  • 11
  • 5
  • What's the problem?, the `decodeFile` method is the proper way to scale huge images down. Just make use of it instead of the regular BitmapFactory methods in your code. If your source is not a File, but a Stream or something similar, just adapt the `decodeFile` method to expect that parameter. You will find the adaptation really easy, try it. – thelawnmowerman Feb 16 '13 at 12:10

2 Answers2

0

Use a blob column in your DB and save the images base64 encoded, then you can decode it without trouble, only thing is that you could run in a memory-heap if the image-size is to large.

Nickolaus
  • 4,785
  • 4
  • 38
  • 60
0

I think right way is save image as file in internal storage and store path in sqlite. But you have to remember internal cache is limited. So if you want to store lots of image you must use external storage like WhatsApp.
For internal storage limit.

For save and read image from storage.

Internal vs External storage

Mustafa Kuloğlu
  • 1,122
  • 1
  • 8
  • 16