samedi 28 mars 2015

NullPointerException while retrieving Image from SQLite Android

I am trying to insert an Image into SQLite Database and retrieve it. I think the data is inserted successfully,but the program stops while retrieving it. Can you please help me?. Logcat shows java.lang.NullPointerException at com.example.mypassword.Login$1.onClick(Login.java:51)


I have attached the code to insert and retrieve the Image. This is my SQLiteOpenHelper class.



public class SQL extends SQLiteOpenHelper {

public static final String DB_NAME="New.db";
public static final String TABLE_NAME="Sample";
public static final int DB_VERSION=1;

public static final String NAME="Name";
public static final String NO="No";
public static final String IMG="Img";
public static final String PIXELX="PosX";
public static final String PIXELY="PosY";

Cursor cur;
byte[] blob;
String name;
String no;
int pixelx,pixely;
Bitmap bmp;

Context ctxt;
//private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;

public SQL(Context context)
{
super(context,DB_NAME,null,1);
}
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE "+TABLE_NAME+"("+NAME +" TEXT NOT NULL "+","+ NO +" TEXT PRIMARY KEY ,"+IMG +" BLOB,"+PIXELX +" INTEGER, "+ PIXELY +" INTEGER);");
}
public void onUpgrade(SQLiteDatabase db,int old,int newversion)
{
db.execSQL("DROP TABLE IF EXISTS"+TABLE_NAME+";");
onCreate(db);
}
public void drop(SQLiteDatabase db)
{
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+" ;");
}
public void open(SQLiteDatabase db)
{
db=this.getWritableDatabase();
}
public void close(SQLiteDatabase db)
{
db.close();
}

public void insert(SQLiteDatabase db,String name,String no,Bitmap ImgData,int pixelx,int pixely)
{
//db=this.getWritableDatabase();
ContentValues con=new ContentValues();
con.put(NAME, name);
con.put(NO, no);
con.put(IMG, Utility.getBytes(ImgData));
con.put(PIXELX, pixelx);
con.put(PIXELY, pixely);
db.insert(TABLE_NAME, null, con);
}


@SuppressLint("NewApi") public User retrieve(SQLiteDatabase db)
{
cur=db.query(true,TABLE_NAME, new String[]{NAME,NO,IMG,PIXELX,PIXELY},null, null,null, null,null, null,null);
//cur=db.query(TABLE_NAME, new String[]{IMG},null, null,null, null, null);

if(cur.moveToFirst())
{
name=cur.getString(cur.getColumnIndex(NAME));
no=cur.getString(cur.getColumnIndex(NO));
blob=cur.getBlob(cur.getColumnIndex(IMG));
pixelx=cur.getInt(cur.getColumnIndex(PIXELX));
pixely=cur.getInt(cur.getColumnIndex(PIXELY));
cur.close();
return new User(name,no,Utility.getPhoto(blob),pixelx,pixely);
}
cur.close();
return null;
}

public ArrayList<Cursor> getData(String Query){
//get writable database
SQLiteDatabase sqlDB = this.getWritableDatabase();
String[] columns = new String[] { "mesage" };
//an array list of cursor to save two cursors one has results from the query
//other cursor stores error message if any errors are triggered
ArrayList<Cursor> alc = new ArrayList<Cursor>(2);
MatrixCursor Cursor2= new MatrixCursor(columns);
alc.add(null);
alc.add(null);


try{
String maxQuery = Query ;
//execute the query results will be save in Cursor c
Cursor c = sqlDB.rawQuery(maxQuery, null);


//add value to cursor2
Cursor2.addRow(new Object[] { "Success" });

alc.set(1,Cursor2);
if (null != c && c.getCount() > 0) {


alc.set(0,c);
c.moveToFirst();

return alc ;
}
return alc;
} catch(SQLException sqlEx){
Log.d("printing exception", sqlEx.getMessage());
//if any exceptions are triggered save the error message to cursor an return the arraylist
Cursor2.addRow(new Object[] { ""+sqlEx.getMessage() });
alc.set(1,Cursor2);
return alc;
} catch(Exception ex){

Log.d("printing exception", ex.getMessage());

//if any exceptions are triggered save the error message to cursor an return the arraylist
Cursor2.addRow(new Object[] { ""+ex.getMessage() });
alc.set(1,Cursor2);
return alc;
}


}


}


This is my Code to insert data



public class Register extends Activity {
ImageView img;
String picpath;
Bitmap bmp;
Canvas cnvs;
Random r;
int x,y,height,width;
ByteArrayOutputStream blob;
SQL sql;
Paint paint;
String name,no;
Uri data;
SQLiteDatabase db;
String[] filePath={MediaStore.Images.Media.DATA};;
Cursor cur;
TextView txt;
int colIndex;
byte[] imgData;

public Register()
{

}

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.register);



img=(ImageView)findViewById(R.id.imageView1);
sql=new SQL(this);
db=sql.getWritableDatabase();
sql.drop(db);
sql.onCreate(db);
r=new Random();
paint=new Paint();
x=r.nextInt(100);
blob=new ByteArrayOutputStream();


Intent i=getIntent();
name=i.getStringExtra("name");
no=i.getStringExtra("no");
//Open Button
Button open=(Button)findViewById(R.id.button3);
open.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent gal_open=new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(gal_open,1);

}
});
txt=(TextView)findViewById(R.id.textView1);

Button shuffle=(Button)findViewById(R.id.button2);
shuffle.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

bmp=Bitmap.createBitmap(img.getHeight(),img.getWidth(),Bitmap.Config.RGB_565);
cnvs=new Canvas(bmp);

height=img.getMeasuredHeight();
width=img.getMeasuredWidth();
x=r.nextInt(height);
y=r.nextInt(width);
paint.setColor(Color.RED);


txt.setText(x+","+y);
cnvs.drawBitmap(BitmapFactory.decodeFile(picpath), 0, 0, null);
cnvs.drawRect(x, y,x+20,y+20 , paint);
img.setImageBitmap(bmp);

}
});
Button ok= (Button)findViewById(R.id.button1);
txt=(TextView)findViewById(R.id.textView1);

ok.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
txt.setText(x+"'"+y);
sql.insert(db,"Vignesh","9578323986",bmp,x,y);

}
});
}
public void onDraw()
{

}
public void onActivityResult(int requestCode,int resultCode,Intent intentData)
{
super.onActivityResult(requestCode, resultCode, intentData);
if(requestCode==1 && resultCode==RESULT_OK && intentData!=null)
{

bmp=Bitmap.createBitmap(img.getHeight(),img.getWidth(),Bitmap.Config.RGB_565);
cnvs=new Canvas(bmp);
//img.setImageBitmap(bmp);

height=img.getMeasuredHeight();
width=img.getMeasuredWidth();
x=r.nextInt(height);
y=r.nextInt(width);
paint.setColor(Color.RED);

data=intentData.getData();

cur=getContentResolver().query(data,filePath,null,null,null );
cur.moveToFirst();

colIndex=cur.getColumnIndex(filePath[0]);
picpath=cur.getString(colIndex);
cur.close();

txt=(TextView)findViewById(R.id.textView1);
txt.setText(x+","+y);
cnvs.drawBitmap(BitmapFactory.decodeFile(picpath), 0, 0, null);
cnvs.drawRect(x, y,x+20,y+20 , paint);
img.setImageBitmap(bmp);

}
}


}


This is my Utility class code



public class Utility {
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, stream);
return stream.toByteArray();
}

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

}


This is my User class code



public class User {
String name,no;
int pixelx,pixely;
public Bitmap bmp;

public User(String n,String num,Bitmap img,int pixel1,int pixel2)
{
name=n;
no=num;
bmp=img;
pixelx=pixel1;
pixely=pixel2;

}

public Bitmap retBmp()
{
return bmp;

}

public String Name()
{
return name;
}

public String No()
{
return no;
}

public int PixelX()
{
return pixelx;
}
public int PixelY()
{
return pixely;
}
}

Aucun commentaire:

Enregistrer un commentaire