从android中的SQLite数据库中获取图像

时间:2013-05-14 22:48:18

标签: android database sqlite

我无法从数据库中获取图像,请查看我的databasehelper(即我的fetchimg(String i)和MainActivity(即showmeth(View w))类。

我实际上在这里做的是首先用相机捕捉图像,然后将它临时粘贴在第一张ImageView上,点击保存按钮后,它会保存在数据库中(没问题)。但是,当我单击“显示”按钮时,它必须通过将引用ID作为textview的id显示在第二个ImageView中的图像,但它没有显示图像,即showmeth(View w)无法从数据库中获取图像。

我的主要活动

package com.example.expnewbutton;

import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Uri fileUri;
    Bitmap img;
    TextView t1;
    databasehelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t1 = (TextView) findViewById(R.id.text);
        helper = new databasehelper(this);
    }

    public void cammethod(View w) {
        try {
            PackageManager packageManager = getPackageManager();
            boolean doesHaveCamera = packageManager
                    .hasSystemFeature(PackageManager.FEATURE_CAMERA);

            if (doesHaveCamera) {
                // start the image capture Intent
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // Get our fileURI
                // fileUri = getOutputMediaFile();

                intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
                startActivityForResult(intent, 100);

            }
        } catch (Exception ex) {
            Toast.makeText(getApplicationContext(),
                    "There was an error with the camera.", Toast.LENGTH_LONG)
                    .show();
        }
    }

    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        if (requestCode == 100) {
            if (resultCode == RESULT_OK) {
                if (intent == null) {
                    // The picture was taken but not returned
                    Toast.makeText(
                            getApplicationContext(),
                            "The picture was taken and is located here: "
                                    + fileUri.toString(), Toast.LENGTH_LONG)
                            .show();
                } else {
                    // The picture was returned
                    Bundle extras = intent.getExtras();
                    img = (Bitmap) extras.get("data");
                    ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
                    imageView1.setImageBitmap((Bitmap) extras.get("data"));
                }
            }
        }

    }

    public void insertimg(View w) {
        long a = 0;
        String id = t1.getText().toString();
        try {
            helper.deleterecord(id);
            a = helper.insert(id, img);

            if (a >= 1) {
                Toast.makeText(getBaseContext(),
                        a + "Record Successfully Saved", 30).show();
            } else {

                Toast.makeText(getBaseContext(), "Not Saved", 30).show();

            }
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), "there is error", 5).show();
        }
    }

    public void showmeth(View w) {
        String i = null;
        boolean flag = false;

        i = t1.getText().toString();
        try {
            flag = helper.fetchimg(i);
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), "database exception", 10).show();
        }

        if (flag == true) {
            Toast.makeText(getBaseContext(),
                    "Here your image save on imageview", 10).show();
            ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);
            imageView2.setImageBitmap(helper.bmp);
        } else {
            Toast.makeText(getBaseContext(), "Add a Pic first", 50).show();
        }

    }

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

}

我的数据库文件:

package com.example.expnewbutton;

import java.io.ByteArrayOutputStream;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.util.Log;

public class databasehelper extends SQLiteOpenHelper {

    final static String databasename = "Image";
    final static int databaseversion = 1;
    Bitmap bmp = null;

    public databasehelper(Context ctx) {
        super(ctx, databasename, null, databaseversion);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {

            Log.d("tag4545", "database");
            db.execSQL("create table mypic(id text,pic BLOB)");

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("drop table if Exists mypic");
        // db.execSQL("drop table if Exists emer");
        onCreate(db);

    }

    public long insert(String id, Bitmap img) {

        SQLiteDatabase base = getWritableDatabase();
        byte[] data = getBitmapAsByteArray(img); // this is a function
        ContentValues value = new ContentValues();
        value.put("id", id);
        value.put("pic", data);

        long a = base.insert("mypic", null, value);

        return a;
    }

    public static byte[] getBitmapAsByteArray(Bitmap bitmap) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }

    public boolean fetchimg(String i) {

        SQLiteDatabase base = getReadableDatabase();
        Cursor cs = null;
        try {
            cs = base.query("mypic", new String[] { "pic" }, "id=?",
                    new String[] { "i" }, null, null, null);

            /*
             * String qu= "select pic from mypic where id"+i;
             * 
             * Cursor cs=null; try{ cs =base.rawQuery(qu, null); }
             * catch(Exception e) { return false; }
             */
            if (cs != null) {
                cs.moveToFirst();
                byte[] imgbyte = cs.getBlob(0);
                cs.close();
                bmp = BitmapFactory.decodeByteArray(imgbyte, 0, imgbyte.length);
                return true;
            }

            else {
                return false;

            }
        }

        catch (Exception e) {
            return false;
        }
    }

    public void deleterecord(String pe_id) {
        SQLiteDatabase base = getWritableDatabase();
        base.delete("mypic", "id=?", new String[] { pe_id });
    }

}

我的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:background="@drawable/gb2"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="32dp"
        android:layout_toRightOf="@+id/textView2"
        android:onClick="cammethod"
        android:text="Cam" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_marginLeft="46dp"
        android:layout_toRightOf="@+id/button1"
        android:onClick="insertimg"
        android:text="Save" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignParentRight="true"
        android:layout_marginRight="22dp"
        android:text="Photo"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text"
        android:layout_toRightOf="@id/imageView1"
        android:onClick="showmeth"
        android:text="show" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/imageView1" />

</RelativeLayout>

请帮我代码,我很快就需要它。谢谢。

所以问题可能在于数据库查询(我尝试使用我隐藏的方法或不隐藏的方法进行查询)或者可能在我的代码中使用BLOB。请帮我找错误

1 个答案:

答案 0 :(得分:1)

您正在传递字符串“i”,您需要传递i的值。

您应该将查询更改为:

    cs = base.query("mypic", new String[] { "pic" }, "id=?",
            new String[] { String.valueOf(i) }, null, null, null);