vendredi 31 juillet 2015

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

Suppose I have Prepopulated Database named by "D" that contains 3 field. - ID(pk) - Name - Image Now I want to retrieve this image from Database and try to set on imageview. For that I used 3 Class - MainActivity.java
- Student.java
- PrepopuDB.java

My code for these 3 classes: 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

    }

}

Student.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;
    }

}

And my XML code looks Like:

<RelativeLayout xmlns:android="http://ift.tt/nIICcg"
xmlns:tools="http://ift.tt/LrGmb4"
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"/>

After write all this code my apps didn't work properly. On error log it shows enter image description here

So here I ask your help. Any kind of helps to get rid of this problem is highly appreciated. Thank U :)

Aucun commentaire:

Enregistrer un commentaire