0

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://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"/>

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 :)

1 Answer 1

1

Hy,

Firstly I don't recommend to save the picture in database or to keep it in memory while is not necessary. You should store it locally in picture folder or if you don't want it to be public save it in the application's directory.

Then in database you should store only the picture's path as String and when you would like to display it take the path from database as string and load it into a bitmap object and set the imageview's source picture with the bitmap loaded previously.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.