dimanche 4 octobre 2015

App Force Closing while inserting image into Sqlite Database

I am trying to insert image into Database but My app force closes whenever i launch my app. Main problem is in DictionaryDatabase.java file where i am trying to decode image into byte array. Here is my code. DictionaryDatabase.java:

package com.shehryar.dictionary;

import java.util.ArrayList;

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.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextDirectionHeuristic;

public class DictionaryDataBase extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "DictDB";
public static final String TABLE_NAME = "Dict_Table";
public static final String KEY_ROW_ID = "id";
public static final String WORD_COL = "word";
public static final String DEF_COL = "definition";
public static final String IMG_COL = "image";
Context applicationContext;

byte[] img;
Bitmap         bitmap=BitmapFactory.decodeResource(applicationContext.getResources(), R.drawable.ic_launcher);

public DictionaryDataBase(Context context) {

    super(context,DATABASE_NAME, null, 1);
    // TODO Auto-generated constructor stub
}


@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
applicationContext=MainActivity.getContextOfApplication();

    Bitmap bitmap=BitmapFactory.decodeResource(applicationContext.getResources(), R.drawable.ic_launcher);
    img=DbBitmapUtility.getBytes(bitmap);//Here is the problem. Whenever i add this and above line my app force closes upon launching, otherwise it works fine except it doesn't shows image.
    db.execSQL(
            "CREATE TABLE Dict_Table (id INTEGER PRIMARY KEY, word TEXT NOT NULL, definition TEXT NOT NULL, image BLOB);");

     db.execSQL("INSERT INTO Dict_Table VALUES (1, 'galaxy', 'a collection of stars', '"+img+"')");
    /*
     * db.execSQL(
     * "INSERT INTO Dict_Table VALUES (2, 'star', 'burning ball of gases')"
     * ); db.execSQL(
     * "INSERT INTO Dict_Table VALUES (3, 'facebook', 'a social site')");
     */

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

/*
 * public boolean insertWords() throws SQLException { SQLiteDatabase db =
 * this.getWritableDatabase(); ContentValues cv = new ContentValues(); for
 * (int i = 0; i < words.length; i++) { cv.put(WORD_COL, words[i]);
 * cv.put(DEF_COL, def[i]); } db.insert(TABLE_NAME, null, cv); return true;
 * 
 * }
 */

public ArrayList<String> getAllWords() throws SQLException {
    ArrayList<String> array_list = new ArrayList<String>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
    res.moveToFirst();
    while (res.isAfterLast() == false) {
        array_list.add(res.getString(res.getColumnIndex(WORD_COL)));
        res.moveToNext();

    }
    return array_list;
}

public String GetDefinition() throws SQLException {
    /*
     * SharedPreferences
     * getprefs=PreferenceManager.getDefaultSharedPreferences(
     * applicationContext); String word=getprefs.getString("item",
     * "no item found");
     */

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery("SELECT * FROM Dict_Table WHERE word='" + MainActivity.item + "'", null);
    res.moveToFirst();
    String def = res.getString(res.getColumnIndex(DEF_COL));
    if (!res.isClosed()) {
        res.close();
    }
    return def;

}

public byte[] Getimage() throws SQLException {

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery("SELECT * FROM Dict_Table WHERE word='" + MainActivity.item + "'", null);
    res.moveToFirst();
    byte[] img = res.getBlob(1);
    if (!res.isClosed()) {
        res.close();
    }
    return img;

}
public void addEntry(String word,byte[] image) throws SQLiteException{
    SQLiteDatabase database=this.getWritableDatabase();
    ContentValues cv = new  ContentValues();
    cv.put(WORD_COL, word);
    cv.put(IMG_COL,   image);
    database.insert(TABLE_NAME, null, cv );
}



}

MainAcitivity.java:

package com.shehryar.dictionary;


import android.support.v7.app.ActionBarActivity;
import android.widget.SearchView;
 import android.widget.SearchView.OnQueryTextListener;

import java.security.PublicKey;
import java.util.ArrayList;

import android.R.string;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

 public class MainActivity extends ActionBarActivity implements         OnItemClickListener {
SearchView sv;
ListView list;
ArrayAdapter<String> adapter;
ArrayList<String> arraylist;
public static String item;
public static Context contextOfApplication;

static byte[] img;
DictionaryDataBase db;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
//  Bitmap bitmap= BitmapFactory.decodeResource(getResources(),         R.drawable.ic_launcher);
//img=DbBitmapUtility.getBytes(bitmap); 

db=new DictionaryDataBase(getApplicationContext());
//db.addEntry("Ic_launcher",img);
arraylist = db.getAllWords();
     contextOfApplication = getApplicationContext();



    sv=(SearchView) findViewById(R.id.edsearch);
    sv.setOnKeyListener(new View.OnKeyListener()
    {
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if (event.getAction() == KeyEvent.ACTION_DOWN)
            {
                switch (keyCode)
                {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                    case KeyEvent.KEYCODE_SEARCH:

                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                        return true;
                    default:
                        break;
                }
            }
            return false;
        }


    });
    list = (ListView) findViewById(R.id.listView);
    adapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arraylist);
    list.setAdapter(adapter);
    list.setOnItemClickListener(this);
    sv.setOnQueryTextListener(new OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextChange(String arg0) {
            // TODO Auto-generated method stub
            adapter.getFilter().filter(arg0);
            return true;
        }
    });
}

public static Context getContextOfApplication(){
    return contextOfApplication;
}

@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;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // TODO Auto-generated method stub
    try {
     item =(String) parent.getItemAtPosition(position);

     String def = db.GetDefinition();
    try{ img=db.Getimage();}
    catch(Exception e){
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
        System.out.println(e.toString());

    }
     Bundle basket = new Bundle();
     basket.putString("word", item);
     basket.putString("def", def);
     basket.putByteArray("img", img);


     Intent a= new Intent(this,Meaning.class);
     a.putExtras(basket);
     startActivity(a);
        //Toast.makeText(this, def, Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
    }

}
}

DbBitmapUtility.java;

package com.shehryar.dictionary;

import java.io.ByteArrayOutputStream;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;

public class DbBitmapUtility {

// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0, stream);
    return stream.toByteArray();
}

// convert from byte array to bitmap
public static Bitmap getImage(byte[] image) {
    return BitmapFactory.decodeByteArray(image, 0, image.length);
}

}

Aucun commentaire:

Enregistrer un commentaire