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>
先保存图片到数据,然后再读取图片显示出来.