Android Sqite数据库 <8>

继续前面的,有时候数据库需要保存图片,一般个人认为这是在特殊情况下才会这么做的,否则一般只保存图片音频等文件的路径:

这个就不需要步骤,直接给出demo即可以参考了:

package com.example.androidsavepicdemo;

import java.io.ByteArrayOutputStream;

import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private SQLiteDatabase db;
    private static final String TB_NAME = "pic";
    private static final String ID = "id";
    private static final String IMAGE = "image";

    private Button mSavePicBtn;
    private Button mShowPicBtn;

    private ImageView mImage;

    private String sql = "create table " + TB_NAME + " ( " + ID
            + " integer primary key , " + IMAGE + " BLOB )";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mShowPicBtn = (Button) findViewById(R.id.button2);
        mShowPicBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 从数据库读取图片,并且显示出来
                mImage.setImageBitmap(getBmp(1));

            }

        });

        mImage = (ImageView) findViewById(R.id.imageView2);

        mSavePicBtn = (Button) findViewById(R.id.button1);

        mSavePicBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 将图片插入数据库
                insert(img(R.drawable.ic_jog_dial_unlock));

            }

        });

        // 创建数据库,如果存在即打开数据库
        db = SQLiteDatabase.openOrCreateDatabase(getFilesDir().toString()
                + "/temppic.db", null);

        // 创建一次就可以了,如果已经存在pic表再次创建将会产生异常.
        // 所以要加一个捕获异常的操作
        try {
            db.execSQL(sql);
        } catch (Exception e) {

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public long insert(byte[] img) {

        ContentValues cv = new ContentValues();
        cv.put(IMAGE, img);
        long result = db.insert(TB_NAME, null, cv);
        return result;

    }

    public Bitmap getBmp(int position) {

        Cursor cursor = db.query(TB_NAME, null, null, null, null, null, null);
        cursor.moveToPosition(position);
        byte[] in = cursor.getBlob(cursor.getColumnIndex(IMAGE));
        Bitmap bmpout = BitmapFactory.decodeByteArray(in, 0, in.length);
        return bmpout;

    }

    // 将图片的id作为参数传递进去
    public byte[] img(int id) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(id))
                .getBitmap();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();

    }

}

对应的XML文件:

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="39dp"
        android:layout_marginTop="28dp"
        android:text="save" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/button1"
        android:layout_marginRight="61dp"
        android:src="@drawable/ic_jog_dial_unlock" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/imageView1"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="59dp"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView2"
        android:layout_alignLeft="@+id/imageView1"
        android:text="show" />

</RelativeLayout>


先保存图片到数据,然后再读取图片显示出来.

 

 

 

 

posted @ 2014-04-02 01:27  MMLoveMeMM  阅读(222)  评论(0)    收藏  举报