将Drawable转换为BLOB数据类型

public Drawable icon; \\ Some value in this field 

我正在SQLite Manager中创建一个数据库。 我想将icon存储到数据库中。 另一个字段显示正确,但是当我使用数据类型为BLOBicon字段时,它不会显示。

 public void prettyPrint() { public String appname = "asd"; public String pname = "asd"; public String versionName = "asd"; public int versionCode = 0; public Drawable icon="android.im...."; Insall_app_db i1 = new Insall_app_db(); i1.createDatabse("appInfo3", getBaseContext()); i1.createTable("off_appinfo4", getBaseContext()); i1.insertDataUser("off_appinfo4", appid ,appname,pname, versionName, versionCode, icon, x); } package com.AppInfo; import java.sql.Blob; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import android.R.drawable; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.drawable.Drawable; public class Insall_app_db { SQLiteDatabase sampleDB = null; String PhoneNumber; String UserId; Cursor c; ArrayList ar=new ArrayList(); public void createDatabse(String DbName,Context context) { sampleDB = context.openOrCreateDatabase(DbName, context.MODE_WORLD_READABLE,null); } public void createTable(String Tablename,Context context) { sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + Tablename + "(app_id INT,app_name VARCHAR(255),pname VARCHAR(255),version_name VARCHAR(25),versionCode INT,icon BLOB,date DATE);"); } public void DeleteTable(String Tablename,Context context) { sampleDB.execSQL("DROP TABLE off_appinfo4"); } public void insertDataUser(String tableName,int app_id,String app_name,String pname,String version_name,int versionCode,String d,long date1) { sampleDB.execSQL("INSERT INTO " + tableName + " Values ("+app_id+",'"+app_name+"','"+pname+"','"+version_name+"','"+versionCode+"','"+d+"',"+date1+");"); } public String GetUserData(Context context,String tablename) { c = sampleDB.rawQuery("SELECT User_Id FROM " + tablename + "", null); if(c!=null) { if(c.moveToFirst()) { do { UserId=c.getString(c.getColumnIndex("User_Id")); }while(c.moveToNext()); } } return UserId; } public void close() { sampleDB.close(); } } 

您可以将图像转换为字节数组,并将该bytearray存储在数据库中的blob中。 您可以将数据作为字节数组从数据库中检索回来。

如何从imageview获取字节数组:

 ImageView iv = (ImageView) findViewById(R.id.splashImageView); Drawable d = iv.getBackground(); BitmapDrawable bitDw = ((BitmapDrawable) d); Bitmap bitmap = bitDw.getBitmap(); System.out.println(".....d....."+d); System.out.println("...bitDw...."+bitDw); System.out.println("....bitmap...."+bitmap); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] imageInByte = stream.toByteArray(); 

在数据库中存储字节数组:

 ContentValues cv = new ContentValues(); cv.put(CHUNK, buffer); //CHUNK blob type field of your table long rawId = database.insert(TABLE, null, cv); //TABLE table name 

从字节数组中检索图像:

 public static Bitmap convertByteArrayToBitmap( byte[] byteArrayToBeCOnvertedIntoBitMap) { bitMapImage = BitmapFactory.decodeByteArray( byteArrayToBeCOnvertedIntoBitMap, 0, byteArrayToBeCOnvertedIntoBitMap.length); return bitMapImage; } 

我在上面的答案中做了一些改动来得到字节数组imageview

ImageView iv =(ImageView)findViewById(R.id.splashImageView);

 iv.setDrawingCacheEnabled(true); Bitmap bitmap = iv.getDrawingCache(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] bitmapdata = stream.toByteArray(); 

如果要将多个图像保存到数据库,则可以创建自己的方法,如下所示://将图像从drawable检索到int数组:

 int[] IMAGES = { R.drawable.yourimage1, R.drawable.yourimage2, R.drawable.yourimage3, R.drawable.yourimage4, R.drawable.yourimage5 }; //create method to convert drawable images(which are in int) to byte[] as below: public byte[] convertToByteArray(int image){ Resources resources = getResources(); Drawable drawable = resources.getDrawable(image); Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress( Bitmap.CompressFormat.PNG, 100, stream); byte[] bitmapData = stream.toByteArray(); return bitmapData; } 

现在调用此方法如下:byte [] image = convertToByteArray(IMAGES [position]); // dbAdapter.insertValues(image);