4

I want to show images in my customlistview from my sqlite database.I successfully converted an array of bitmap images,and wrote code for converting back to bitmap images.But images are not showing off.I am using SqliteDatabaseHelper class to insert images to database.All other values except images are displaying.What value should I insert??Please help

MainActivity.java

public class MainActivity extends Activity{


ListView prd_list;
public static Integer clas;
byte [] imge;

int j;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    prd_list = (ListView) findViewById(R.id.list);
    DataBaseHandler dbh = new DataBaseHandler(this);

    /////////converting image to bytearray//////

    Bitmap[] images = { BitmapFactory.decodeResource(getResources
            (),R.drawable.candle1),BitmapFactory.decodeResource(getResources   
            (),R.drawable.candl3),BitmapFactory.decodeResource(getResources(),R.drawable.lawn)}; 

    byte[][] img = new byte[images.length][];
    for (j=0; j<images.length; j++) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        images[j].compress(Bitmap.CompressFormat.PNG, 100, bos);
        img[j] = bos.toByteArray();
    }
        //////////////////////////////////////

    SQLiteDatabase db = dbh.getWritableDatabase();
    Cursor cr = db.rawQuery("SELECT * FROM product", null);
    final String[] pname = new String[cr.getCount()];
    String[] price = new String[cr.getCount()];

    int i = 0;
    j=0;
    while(cr.moveToNext())
    {

        String name = cr.getString(cr.getColumnIndex("pname"));
        String prprice = cr.getString(cr.getColumnIndex("pprice"));
        imge=cr.getBlob(cr.getColumnIndex("pimage"));

        img[j] = imge;
        pname[i] = name;
        price[i] = prprice;
        i++;
        j++;

    }
    ListAdapter adapter = new ListAdapter(this, img,pname, price);
    prd_list.setAdapter(adapter);
    }

ListAdapter.java

public class ListAdapter extends BaseAdapter {

private final String[] pname;
private final String[] price;
private final byte[] []img;
int j=0;

private Context mcontext;
        public ListAdapter(Context c,byte[][]img,String[] pname,String[] price){
    mcontext=c;
    this.pname=pname;
    this.price=price;
    this.img=img;
}

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return pname.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
         View List;
         LayoutInflater mLayoutinflater=(LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         if(convertView==null){
         List=new View(mcontext);

         List=mLayoutinflater.inflate(R.layout.mylist, parent, false);
         }
         else{
         List = (View)convertView;
         }

         TextView textView1 = (TextView)List.findViewById(R.id.pr_name);
         TextView textView2 = (TextView)List.findViewById(R.id.pr_price);
         ImageView imageview= (ImageView)List.findViewById(R.id.pr_img);
         textView1.setText(pname[position].toString());
         textView2.setText("Rs "+price[position] +" /-");   
         if(img.length>0){
         Bitmap b1=BitmapFactory.decodeByteArray(img[j], 0, img[j].length);
         imageview.setImageBitmap(b1);   
         }
         // TODO Auto-generated method stub
         return List;

    }

}

DataBaseHandler.java

public class DataBaseHandler extends SQLiteOpenHelper{

public static final int DATABASE_VERSION = 1;
   public static final String DATABASE_NAME = "products.db";
   public static final String CONTACTS_TABLE_NAME = "product";
   public static final String CONTACTS_COLUMN_ID = "pid";
   public static final String CONTACTS_COLUMN_NAME = "pname";
   public static final String CONTACTS_COLUMN_EMAIL = "pspec";
   public static final String CONTACTS_COLUMN_STREET = "pprice";
   public static final String CONTACTS_COLUMN_CITY = "pfeature";
   public static final String CONTACTS_COLUMN_PHONE = "pimage";

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

    // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

    db.execSQL("CREATE TABLE IF NOT EXISTS product(pimage BLOB,pid INTEGER PRIMARY KEY,pname TEXT,pprice NUMERIC,pspec TEXT,pfeature TEXT)");
    db.execSQL("INSERT INTO product(pimage,pname,pprice,pspec) VALUES('img[0]','Candle stick 1',4000,'Solar garden / pathway light,Solar Panel:1pc crystal silicon solar cell, Battery:1pc 1.2V Ni-MH/Ni-CD AA battery 600MA ,Material:Stainless steel ,WaterProof and safe ')");
    db.execSQL("INSERT INTO product(pimage,pname,pprice,pspec) VALUES('img[1]','Candle stick 3','4500','Solar garden / pathway light, Solar Panel:1pc crystal silicon solar cell, Battery:1pc 1.2V Ni-MH/Ni-CD AA battery 600MA, Material:Stainless steel, WaterProof and safe IP44 ')");

    db.execSQL("INSERT INTO product(pimage,pname,pprice,pspec) VALUES('img[6]','Senson',4500,'Solar garden / pathway light, Solar Panel:1pc crystal silicon solar cell, Battery:1pc 1.2V Ni-MH/Ni-CD AA battery 600MA, Material:Stainless steel, WaterProof and safe IP44 ')");
    db.execSQL("INSERT INTO product(pimage,pname,pprice,pspec) VALUES('img[7]','Thejus',7500,'Solar garden / pathway light, Solar Panel:1pc crystal silicon solar cell, Battery:1pc 1.2V Ni-MH/Ni-CD AA battery 600MA, Material:Stainless steel, WaterProof and safe IP44 ')");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}
public void addEntry( byte[] image) throws SQLiteException{
    SQLiteDatabase products = getWritableDatabase(); 
    ContentValues cv = new  ContentValues();
    cv.put("pimage",   image);
    products .insert( CONTACTS_TABLE_NAME, null, cv );
}

public void addEntries(byte[][] img) {
    for(int i = 0 ; i < img.length ; i++) 
        addEntry(img[i] );
}

}

EDITED

public void addEntry( byte[] image) throws SQLiteException{
    SQLiteDatabase products = getWritableDatabase(); 
    ContentValues cv = new  ContentValues();
    cv.put("pimage",   image);
    products .insert( CONTACTS_TABLE_NAME, null, cv );
}

public void addEntries(byte[][] img) {
    for(int i = 0 ; i < img.length ; i++) 
        addEntry(img[i] );
}
droid
  • 184
  • 13
  • `db.execSQL("INSERT INTO product(pimage,pname,pprice,pspec) VALUES('img[0]'` where is img[0] ? – Randyka Yudhistira Feb 06 '15 at 04:31
  • my image array is img [ j ] . I tried to access each image using their indexex like img[0],img[1]... – droid Feb 06 '15 at 04:33
  • check this question :http://stackoverflow.com/questions/11790104/how-to-storebitmap-image-and-retrieve-image-from-sqlite-database-in-android – ReZa Feb 06 '15 at 04:36

2 Answers2

2

save your images like this :

public void addEntry( String name, byte[] image) throws SQLiteException{
    ContentValues cv = new  ContentValues();
    cv.put(KEY_NAME,    name);
    cv.put(KEY_IMAGE,   image);
    database.insert( DB_TABLE, null, cv );
}

public void addEntries(String[] name , byte[][] img) {
    for(int i = 0 ; i < name.length ; i++) 
        addEntry(name[i] , img[i] );
}
ReZa
  • 1,273
  • 2
  • 18
  • 33
  • @droid inside your DataBaseHandler class. – ReZa Feb 06 '15 at 05:05
  • I am not familiar with this sqlite open class.I updated your answer in my code.Is that correct? and My database and table name cannot be resolved.showing an error. – droid Feb 06 '15 at 05:24
  • change your code ,add : SQLiteDatabase products = getWritableDatabase(); and chnge this line products.insert( product, null, cv ); to :products.insert( CONTACTS_TABLE_NAME, null, cv ); – ReZa Feb 06 '15 at 05:36
  • Still not showing my images.I have updated my code as EDITED.Is there any error? .In for loop ,Is that img.length o image.length ? – droid Feb 06 '15 at 06:11
0

try this in Your adapter to get the image :

byte[] outImage=img[j];
ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
Bitmap theImage = BitmapFactory.decodeStream(imageStream);
imageview.setImageBitmap(theImage);
arash sc
  • 91
  • 2
  • 5