簡體   English   中英

如何在Android Apps Develoment中從SQLite數據庫檢索圖像?

[英]How to retrieve image from SQLite database in Android Apps Develoment?

假設我有一個由“ D”命名的預填充數據庫,其中包含3個字段。 -ID(pk)-名稱-圖像現在,我想從數據庫中檢索該圖像並嘗試在imageview上進行設置。 為此,我使用了3類-MainActivity.java
-Student.java
-PrepopuDB.java

我的這三個類的代碼: MainActivity.java

package com.example.db_image;
import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
    TextView tvName;
    Button btn;
    ImageView iv;
    private PrePopuDB pdb;
    ArrayList<Student> all;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialize();
        all = pdb.getAllInfo();

    }
    void initialize(){
        tvName = (TextView)findViewById(R.id.textView2);
        btn  = (Button)findViewById(R.id.button1);
        iv = (ImageView)findViewById(R.id.imageView1);
        pdb = new PrePopuDB(getApplicationContext());
    }
    public void show(View v){

        Student std = all.get(i);
        tvName.setText(std.getName());
        iv.setImageBitmap(getPhoto(std.getPh())); // Try to set bitmap image to imageview
        i++;        
    }
    private Bitmap getPhoto(byte[] phot){// this function try to convert byte array to Bitmap image. And return bitmap image.
        return BitmapFactory.decodeByteArray(phot, 0, phot.length);
    }

}

PrepopuDB.java

package com.example.db_image;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

public class PrePopuDB extends SQLiteOpenHelper {
    public static final String DB_NAME = "D";
    public static final String Table_NAME = "T";
    public static final String ID = "id";
    public static final String NAME = "name";
    public static String DB_PATH;
    public static final String PH = "photo";
    Context context;
    private SQLiteDatabase database;

    public PrePopuDB(Context context) {
        super(context, DB_NAME, null, 1);
        this.context = context;
        String packageName = context.getPackageName();
        DB_PATH = "/data/data/" + packageName + "/databases/";
        this.database = openDB();

    }

    public synchronized void close() {
        if (this.database != null) {
            this.database.close();
        }
    }

    public SQLiteDatabase openDB() {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDB();
            database = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }
        return database;
    }

    private void createDB() {
        if (!checkDB()) {
            this.getReadableDatabase();
            copyDB();
        } else {
            Log.e(getClass().getName(), "DB Exist");
        }
    }

    private void copyDB() {
        try {
            InputStream is = context.getAssets().open(DB_NAME);
            String path = DB_PATH + DB_NAME;
            OutputStream op = new FileOutputStream(path);
            byte[] buffer = new byte[4096];
            int readcount = 0;
            while ((readcount = is.read(buffer)) > 0) {
                op.write(buffer, 0, readcount);
            }
            is.close();
            op.close();

        } catch (IOException e) {

            e.printStackTrace();
        }
    }

    public boolean checkDB() {
        String path = DB_PATH + DB_NAME;
        File file = new File(path);
        if (file.exists()) {
            return true;
        } else
            return false;
    }

    public ArrayList<Student> getAllInfo() {
        ArrayList<Student> allinfo = new ArrayList<Student>();
        // SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = this.database.query(Table_NAME, null, null, null, null,
                null, null);
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToFirst();
            for (int i = 0; i < cursor.getCount(); i++) {
                int id = cursor.getInt(cursor.getColumnIndex(ID));
                String name = cursor.getString(cursor.getColumnIndex(NAME));
                // Try to get image in binary form
                byte[] pho = cursor.getBlob(cursor.getColumnIndex(PH));

                Student std = new Student(id, name, pho);
                allinfo.add(std); // store student class in array list
                cursor.moveToNext();
            }
        }
        cursor.close();
        // this.database.close();
        return allinfo;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

學生.java

package com.example.db_image;

import java.sql.Blob;    
import android.graphics.Bitmap; 

public class Student {
    int id;
    String name;
    // little bit confused about data type 
    //Bitmap ph;
    //Blob ph
    byte[] ph;
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public byte[] getPh() {
        return ph;
    }
    public Student(int id, String name,byte[] ph) {
        super();
        this.id = id;
        this.name = name;
        this.ph = ph;
    }

}

我的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="com.example.db_image.MainActivity" >

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

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/textView1"
    android:layout_alignBottom="@+id/textView1"
    android:layout_marginLeft="46dp"
    android:layout_toRightOf="@+id/textView1"
    android:text="Sr7 " />

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView2"
    android:layout_marginTop="20dp"
    android:layout_toRightOf="@+id/textView2"
    android:src="@drawable/ic_launcher" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/imageView1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="55dp"
    android:text="Button" 
    android:onClick="show"/>

編寫完所有代碼后,我的應用程序無法正常運行。 在錯誤日志上顯示 在此處輸入圖片說明

因此,在這里請您幫忙。 消除此類問題的任何幫助均受到高度贊賞。 感謝你 :)

HY,

首先,我不建議將圖片保存在數據庫中或在不需要時將其保存在內存中。 您應該將其本地存儲在圖片文件夾中,或者如果不希望將其公開,則將其保存在應用程序的目錄中。

然后在數據庫中,您應該只將圖片的路徑存儲為String,當您要顯示它時,將來自數據庫的路徑作為字符串,並將其加載到位圖對象中,並使用先前加載的位圖設置imageview的源圖片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM