【问题标题】:How to insert an image into sqlite database in android?如何在android中将图像插入sqlite数据库?
【发布时间】:2015-03-24 18:16:59
【问题描述】:

我已从 URL 中检索到图像。我想将此图像插入 SQLite 数据库。 我尝试在编码后插入它,但其中存储了一个字符串值。任何人都可以建议如何将图片插入 SQLite 数据库。这是我的代码:

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();
}

【问题讨论】:

标签: android sqlite


【解决方案1】:

将图像放入数据库是一种糟糕的做事方式——你会膨胀数据库b并从中获取数据,然后需要将其转换为正确的格式。相反,将其存储到磁盘*(SDCARD)* 并将您存储到的 文件名 放入数据库中。然后从 SDCARD 加载它。

【讨论】:

  • 请采纳答案。
  • 根据 SQLite 架构师和主要开发人员 Richard Hipp 的说法,将图像放入数据库是一种的做事方式sqlite.1065341.n5.nabble.com/…
【解决方案2】:

您应该查找 BLOB 类型信息,这是在数据库中存储图像的唯一方法。但是你需要先转换你的位图。

【讨论】:

    【解决方案3】:

    它必须编码为base64 String Vist [http://developer.android.com/reference/android/util/Base64.html]

    【讨论】:

      【解决方案4】:

      您应该只在数据库中插入图像的路径。

      String path = Images.Media.insertImage(context.getContentResolver(), bm, "YourTitle", null);
      

      并将路径作为字符串插入...

      【讨论】:

        【解决方案5】:
        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;
        
        }
        

        }

        你可以使用上面的 util 类。

        【讨论】:

          【解决方案6】:
          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();
                      }
                  }
          
          }
          

          你可以使用上面的代码..

          【讨论】:

            猜你喜欢
            • 2023-02-07
            • 2011-07-22
            • 2011-07-16
            • 2021-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-15
            • 1970-01-01
            相关资源
            最近更新 更多