Reputation: 1622
I have retrieved an image from a URL. I want to insert this image into a SQLite database. I tried inserting it after encoding, but a sting value is getting stored in it. Can anyone suggest how to insert a picture into SQLite database. Here are my codes:
Login.java
final String t1=user.getId();
final String t2=user.getName();
AsyncTask<Void, Void, Bitmap> t = new AsyncTask<Void, Void, Bitmap>(){
@Override
protected Bitmap doInBackground(Void... arg0) {
// TODO Auto-generated method stub
Bitmap bm = null;
try {
URL aURL = new URL("http://graph.facebook.com/"+t1+"/picture?type=small");
URLConnection conn = aURL.openConnection();
conn.setUseCaches(true);
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
}
catch (IOException e) {
e.printStackTrace();
}
return bm;
}
protected void onPostExecute(Bitmap bm){
//Drawable drawable = new BitmapDrawable(getResources(), bm);
Bitmap b1=bm;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
b1.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
// Log.w("bit",""+drawable);
String encodedImage = Base64.encodeToString(b,Base64.DEFAULT);
fbdetails.put("fbname",t2);
fbdetails.put("fbuserid",t1);
fbdetails.put("fbpic",encodedImage);
db.insertme(fbdetails);
}
};
t.execute();
}
});
Databasehandler.java
public void insertme(HashMap<String, String> queryValues) {
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("fbname", queryValues.get("fbname"));
values.put("fbuserid", queryValues.get("fbuserid"));
values.put("fbpic", queryValues.get("fbpic"));
database.insert("me", null, values);
database.close();
}
Upvotes: 0
Views: 7073
Reputation: 47
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
public class MyDataBase extends SQLiteOpenHelper{
public MyDataBase(Context context, String dbname, CursorFactory factory, int dbversion) {
super(context, dbname, factory, dbversion);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table tableimage(image blob);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
========================================
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener{
private ImageView imageview=null;
private Button btninsert=null;
private Button btnretrive=null;
private MyDataBase mdb=null;
private SQLiteDatabase db=null;
private Cursor c=null;
private byte[] img=null;
private static final String DATABASE_NAME = "ImageDb.db";
public static final int DATABASE_VERSION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btninsert=(Button)findViewById(R.id.button_insert);
btnretrive= (Button)findViewById(R.id.button_retrieve);
imageview= (ImageView)findViewById(R.id.imageView_image);
imageview.setImageResource(0);
btninsert.setOnClickListener(this);
btnretrive.setOnClickListener(this);
mdb=new MyDataBase(getApplicationContext(), DATABASE_NAME,null, DATABASE_VERSION);
Bitmap b=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, bos);
img=bos.toByteArray();
db=mdb.getWritableDatabase();
}
@Override
public void onClick(View arg0) {
if(btninsert==arg0)
{
ContentValues cv=new ContentValues();
cv.put("image", img);
db.insert("tableimage", null, cv);
Toast.makeText(this, "inserted successfully", Toast.LENGTH_SHORT).show();
}
else if(btnretrive==arg0)
{
String[] col={"image"};
c=db.query("tableimage", col, null, null, null, null, null);
if(c!=null){
c.moveToFirst();
do{
img=c.getBlob(c.getColumnIndex("image"));
}while(c.moveToNext());
}
Bitmap b1=BitmapFactory.decodeByteArray(img, 0, img.length);
imageview.setImageBitmap(b1);
Toast.makeText(this, "Retrive successfully", Toast.LENGTH_SHORT).show();
}
}
}
you can use above code..
Upvotes: 0
Reputation: 444
public class ImageManipulation {
public static String encodeImage(byte[] imageByteArray) {
return Base64.encodeToString(imageByteArray, 0);
}
public static byte[] decodeImage(String imageDataString) {
return Base64.decode(imageDataString, 0);
}
public static Drawable getDrawableFromString(String imageString) {
byte[] imageBytes = decodeImage(imageString);
Drawable image = null;
image = new BitmapDrawable(BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length));
return image;
}
}
You can use above util class.
Upvotes: 0
Reputation: 519
You should only insert the path of the image in the database.
String path = Images.Media.insertImage(context.getContentResolver(), bm, "YourTitle", null);
And insert the path as String ...
Upvotes: 0
Reputation: 129
it must be coded base64 String Vist [http://developer.android.com/reference/android/util/Base64.html]
Upvotes: 0
Reputation: 126
You should look for BLOB type information, it's the only way to store image in your database. But you'll need to convert your bitmap first.
Upvotes: 1
Reputation: 6737
Putting the image in the database is a bad way of doing things- you bloat the databaseb and get data out of it that then needs to be converted to the right format. Instead, store it to disk*(SDCARD)* and put the filename you stored it to in the db. Then load it from SDCARD.
Upvotes: 1