1.从图片文件生成Bitmap对象,再将对象转换成字节数组存入数据库,与直接将文件转换成字节数组再存入数据库不同,前者包含的信息远大于后者。文件到字节数组直接通过FileInputStream,而Bitmap对象到字节数组需通过Parcel序列化,从数据库的字节数组到文件或Bitmap对象与其对应的方法相反。
2.Blob在数据库中是一种无类型,任何文件或对象都可转换成字节数组存入数据库,但文件的存入对应文件的读取,对象的存入对应对象的读取。
----------------------------------代码------------------------------------------------------
数据库的使用:
public class TestSeedDB {
private SQLiteDatabase mTestDatabase = null;
private static final String TABLE_SEED = "TBseed";
// 打开数据库
public void open() {
this.mTestDatabase =
SQLiteDatabase.openOrCreateDatabase(
SQLiteBase.SDPATH
+ "my.db3", null);
}
// Close the database
public void close() {
mTestDatabase.close();
}
public void CreateSeedTable() {
mTestDatabase.execSQL("create
table TBseed (ID integer primary key autoincrement,"
+
"ToyID TEXT,"
+
"ToySeed BLOB,ToyMemo varchar(50))");
}
public void insertSeedItem(long ToyID, byte[] ToySeed) {
String sqlstr = "insert into "
+ TABLE_SEED+ " (ID, ToyID , ToySeed, ToyMemo) values
(?,?,?,?)";
Object[] args = new Object[] {
100, ToyID + "", ToySeed, "aa" };
mTestDatabase.execSQL(sqlstr,
args);
}
public byte[] GetSeedItem(long ToyID) {
Cursor cur;
byte[] strSeed = null;
String col[] = { "ID", "ToyID",
"ToySeed", "ToyMemo" };
cur =
mTestDatabase.query(TABLE_SEED, col, null, null, null,null,
null);
cur.moveToFirst();
strSeed =
cur.getBlob(2);//得到第二列
if (cur != null)
cur.close();
return strSeed;
}
}
---------------------------------对象存入------------------------------------------------------
public byte[] Bitmap2Bytes() {
Bitmap bit =
BitmapFactory.decodeFile(SDPATH + "test.PNG");
Parcel p =
Parcel.obtain();
bit.writeToParcel(p, 0);
return
p.marshall();//Parcel自带的函数,自己写同样能实现,但效率不高
}
public Bitmap Bytes2Bimap(byte[] bt) {
Parcel pp =
Parcel.obtain();
pp.unmarshall(bt , 0,
bt.length);
System.out.println(pp.dataPosition()); pp.setDataPosition(0);
Bitmap bit =
Bitmap.CREATOR.createFromParcel(pp);
return bit;
}
public void saveMyBitmap(String bitName, Bitmap mBitmap) {
//将Bitmap对象写到SD卡,但会有文件数据部分丢失
File f = new File("/sdcard/" +
bitName + ".png");
try {
f.createNewFile();
FileOutputStream fOut = new
FileOutputStream(f);
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
} catch (Exception e) {
}
}
----------------------------------------文件存入-----------------------------------------------
public byte[] Bitmap2Bytes() {//将文件转换成字节数组
try {
FileInputStream is;
File file =new File(SDPATH +
"test.PNG");
is = new
FileInputStream(file);
byte[] buf =new byte[(int)
file.length()];
//ByteArrayInputStream os = new
ByteArrayInputStream();
Bitmap bit =
BitmapFactory.decodeStream(is);
is.read(buf);
return buf;
} catch (Exception e)
{
// TODO
Auto-generated catch block
e.printStackTrace();
}
return null;
}
//将字节数组转换成文件
FileOutputStream fOut = new
FileOutputStream("/sdcard/aaaa" + ".png");
fOut.write(bt);
注:bt的类型是字节数组,FileInputStream的read和FileOutputStream的write都是相对数据流而言的
前者是有损的,后者文件转换前后无变化