1. 程式人生 > >Android 資料庫存取圖片

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>