Android 資料庫存取圖片
參考:http://blog.sina.com.cn/s/blog_8cfbb99201012oqn.html
MySQLiteOpenHelper
package com.example.administrator.taiyang; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by Administrator on 2018/11/5. */ public class MySQLiteOpenHelper extends SQLiteOpenHelper { // 重寫構造方法 public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory cursor, int version) { super(context, name, cursor, version); } // 建立資料庫的方法 public void onCreate(SQLiteDatabase db) { // 建立一個數據庫,表名:imagetable,欄位:_id、image。 db.execSQL("CREATE TABLE imagetable (_id INTEGER PRIMARY KEY AUTOINCREMENT,image BLOB)"); } // 更新資料庫的方法 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
package com.example.administrator.myapplication; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.ImageView; import java.io.ByteArrayOutputStream; import java.io.IOException; public class Main2Activity extends AppCompatActivity { private MySQLiteOpenHelper mySQLiteOpenHelper; SQLiteDatabase mydb; ImageView iv1; Bitmap imagebitmap; String id="1";//賦值1,2,3...,分別是第一,第二,第三張圖片... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); iv1 = (ImageView) findViewById(R.id.imageView1); try { a(); } catch (IOException e) { e.printStackTrace(); } } private void a() throws IOException { // 建立助手類的例項 // CursorFactory的值為null,表示採用預設的工廠類 mySQLiteOpenHelper = new MySQLiteOpenHelper(this, "saveimage.db", null, 1); // 建立一個可讀寫的資料庫 mydb = mySQLiteOpenHelper.getWritableDatabase(); //將圖片轉化為點陣圖 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.d); //建立一個位元組陣列輸出流,流的大小為size int size = bitmap1.getWidth() * bitmap1.getHeight() * 4; ByteArrayOutputStream baos = new ByteArrayOutputStream(size); //設定點陣圖的壓縮格式,質量為100%,並放入位元組陣列輸出流中 bitmap1.compress(Bitmap.CompressFormat.PNG, 100, baos); //將位元組陣列輸出流轉化為位元組陣列byte[] byte[] imagedata1 = baos.toByteArray(); Log.d("a","1:"+imagedata1); //將位元組陣列儲存到資料庫中 ContentValues cv = new ContentValues(); cv.put("_id", 1); cv.put("image", imagedata1); mydb.replace("imagetable", null, cv); //關閉位元組陣列輸出流 baos.close(); //建立一個指標 Cursor cur = mydb.query("imagetable", new String[]{"_id", "image"}, "_id like ?", new String[]{id}, null, null, null); byte[] imagequery =null; while(cur.moveToNext()) { int id =cur.getInt(cur.getColumnIndex("_id")); imagequery=cur.getBlob(cur.getColumnIndex("image"));//將Blob資料轉化為位元組陣列 //將位元組陣列轉化為點陣圖 imagebitmap = BitmapFactory.decodeByteArray(imagequery, 0, imagequery.length); //將點陣圖顯示為圖片 iv1.setImageBitmap(imagebitmap); } cur.close(); } }
//將圖片轉化為點陣圖
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.d);
//建立一個位元組陣列輸出流,流的大小為size
int size = bitmap1.getWidth() * bitmap1.getHeight() * 4;
ByteArrayOutputStream baos = new ByteArrayOutputStream(size);
//設定點陣圖的壓縮格式,質量為100%,並放入位元組陣列輸出流中
bitmap1.compress(Bitmap.CompressFormat.PNG, 100, baos);
//將位元組陣列輸出流轉化為位元組陣列byte[]
byte[] imagedata1 = baos.toByteArray();
Log.d("a","1:"+imagedata1);
//將位元組陣列儲存到資料庫中
ContentValues cv = new ContentValues();
cv.put("_id", 1);
cv.put("image", imagedata1);
mydb.replace("imagetable", null, cv);
//關閉位元組陣列輸出流
baos.close();
儲存完圖片要將這段程式碼註釋掉,再執行,從資料庫取出圖片。不然會反覆的存圖片到資料庫。
activity_main2.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:attr="http://schemas.android.com/apk/res-auto">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView1"/>
</LinearLayout>