java - Android - 将图像的位图数组插入 SQLite 数据库

标签 java android sqlite bitmap

我想在我的自定义 ListView 中显示来 self 的 sqlite 数据库的图像。我成功地转换了一组位图图像,并编写了用于转换回位图图像的代码。但是图像没有显示。我正在使用 SqliteDatabaseHelper 类插入图像到数据库。显示除图像以外的所有其他值。我应该插入什么值?请帮助

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

}

已编辑

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

最佳答案

像这样保存你的图片:

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

关于java - Android - 将图像的位图数组插入 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28358565/

相关文章:

android - 无法在 Android Studio 中解析符号 'annotation'?

entity-framework - SQLite 和 Entity Framework 6

sql - SQLite3通过使用列而不是行进行分组

java - 如何使用 Tomcat 过滤器保护 pdf 文件?

java - java中Hashmap和ArrayList添加值的方式不同

java - 在 java 中添加 cookie 然后 HTTP 重定向不会在客户端显示 cookie

android - ImageView 或 CardView 打开另一个 Activity onClick

Android 在拨出电话期间检测线路何时连接

mysql - 使用同一个表更新表

Java求同一类不同对象之间最大的属性