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