首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SQLite数据库中存储图像

如何在SQLite数据库中存储图像
EN

Stack Overflow用户
提问于 2012-02-20 15:39:42
回答 3查看 329.7K关注 0票数 86

在我的应用程序中,我从图库上传了一张图片,并希望将该图片存储在SQLite数据库中。如何在数据库中存储位图?我正在将位图转换为字符串,并将其保存在数据库中。在从数据库中检索时,我无法将该字符串分配给ImageView,因为它是一个字符串。

Imageupload12 .java:

代码语言:javascript
复制
     public class Imageupload12 extends Activity {
      Button buttonLoadImage;
      ImageView targetImage;
      int i = 0;
      Database database = new Database(this);
      String i1;
      String img;
      @Override
      public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main5);
       buttonLoadImage = (Button) findViewById(R.id.loadimage);
       targetImage = (ImageView) findViewById(R.id.targetimage);
    
    
       Bundle b = getIntent().getExtras();
       if (b != null) {
        img = b.getString("image");
        targetImage2.setImageURI("image");
        //i am getting error as i cant assign string to imageview.
    
       }
    
       buttonLoadImage.setOnClickListener(new Button.OnClickListener() {
    
        public void onClick(View arg0) {
         // TODO Auto-generated method stub
         Intent intent = new Intent(Intent.ACTION_PICK,
          android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
         Log.i("photo", "" + intent);
         startActivityForResult(intent, i);
         i = i + 1;
        }
       });
    
      }
    
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
       // TODO Auto-generated method stub
       super.onActivityResult(requestCode, resultCode, data);
       switch (requestCode) {
    
        case 0:
         if (resultCode == RESULT_OK) {
          Uri targetUri = data.getData();
          //             textTargetUri.setText(targetUri.toString());
          Bitmap bitmap;
          try {
           bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
           targetImage.setImageBitmap(bitmap);
    
           i1 = bitmap.toString();
           Log.i("firstimage........", "" + i1);
           targetImage.setVisibility(0);
    
           SQLiteDatabase db = database.getWritableDatabase();
           db.execSQL("INSERT INTO UPLOAD VALUES('" + i1 + "');");
    
          } catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
          }
         }
         break;
    
    
    
       }
    
      }
     }

Image.class:

代码语言:javascript
复制
    public class Image extends Activity {
     Database database = new Database(this);
     static EfficientAdapter adapter, adapter1;
     static ListView lv1;
    
     static SQLiteDatabase db;
     static EfficientAdapter adp;
     static Cursor c1;
    
     static Vector < String > IMAGE = new Vector < String > ();
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
    
      db = database.getReadableDatabase();
      c1 = db.rawQuery("select * from UPLOAD;", null);
    
      if (c1.moveToFirst()) {
    
       do {
        IMAGE.add(c1.getString(0).toString());
    
       } while (c1.moveToNext());
    
       c1.close();
      }
    
      lv1 = (ListView) findViewById(R.id.List);
    
      adapter = new EfficientAdapter(this);
    
    
      lv1.setAdapter(adapter);
    
      ImageView add = (ImageView) findViewById(R.id.imv1a);
    
    
    
      add.setOnClickListener(new OnClickListener() {
    
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        IMAGE.clear();
    
        Intent i = new Intent(Image.this, Imageupload12.class);
        startActivity(i);
    
    
       }
      });
    
    
     }
    
    
    
     private static class EfficientAdapter extends BaseAdapter {
    
    
      //        protected  final Context Context = null;
      protected LayoutInflater mLayoutInflater;
      AlertDialog.Builder aBuilder;
      public EfficientAdapter(Context context) {
       // TODO Auto-generated constructor stub
       mLayoutInflater = LayoutInflater.from(context);
      }
    
      @Override
      public int getCount() {
       // TODO Auto-generated method stub
    
       return IMAGE.size();
      }
    
      @Override
      public Object getItem(int position) {
       // TODO Auto-generated method stub
       return position;
      }
    
      @Override
      public long getItemId(int position) {
       // TODO Auto-generated method stub
       return position;
      }
    
      @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
       // TODO Auto-generated method stub
    
       final ViewHolder mVHolder;
       if (convertView == null) {
        convertView = mLayoutInflater.inflate(R.layout.pjtlistdetails, parent, false);
    
        mVHolder = new ViewHolder();
    
        mVHolder.t1 = (TextView) convertView.findViewById(R.id.pjtdetails);
        mVHolder.time = (TextView) convertView.findViewById(R.id.name);
    
    
        mVHolder.imv = (ImageButton) convertView.findViewById(R.id.editic);
        mVHolder.imvd = (ImageView) convertView.findViewById(R.id.delete);
        mVHolder.imvf = (ImageView) convertView.findViewById(R.id.fwd);
    
    
    
    
    
        mVHolder.imv.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
    
    
    
          String img = IMAGE.elementAt(position);
          Log.i("image...", "" + img);
    
          Context ctx = v.getContext();
          Intent myIntent = new Intent();
          ctx = v.getContext();
          myIntent.setClass(ctx, Imageupload12.class);
          myIntent.putExtra("image", img);
    
          ctx.startActivity(myIntent);
    
          IMAGE.clear();
    
         }
        });
        static class ViewHolder {
    
         ImageButton imv;
         ImageView imvd, imvf;
        }
       }
      }
     }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-20 16:12:34

你必须使用"blob“来存储图像。

例如:将图像存储到db:

代码语言:javascript
复制
public void insertImg(int id , Bitmap img ) {   


    byte[] data = getBitmapAsByteArray(img); // this is a function

    insertStatement_logo.bindLong(1, id);       
    insertStatement_logo.bindBlob(2, data);

    insertStatement_logo.executeInsert();
    insertStatement_logo.clearBindings() ;

}

 public static byte[] getBitmapAsByteArray(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0, outputStream);       
    return outputStream.toByteArray();
}

要从数据库检索图像,请执行以下操作:

代码语言:javascript
复制
public Bitmap getImage(int i){

    String qu = "select img  from table where feedid=" + i ;
    Cursor cur = db.rawQuery(qu, null);

    if (cur.moveToFirst()){
        byte[] imgByte = cur.getBlob(0);
        cur.close();
        return BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
    }
    if (cur != null && !cur.isClosed()) {
        cur.close();
    }       

    return null;
} 
票数 127
EN

Stack Overflow用户

发布于 2014-03-05 11:36:07

我认为将图像存储到SQLLite数据库的最好方法是使用Base64算法。它将图像转换为纯文本,然后再转换回来。你可以在www.developersfound.com/Base64FromStream.zip下载完整的示例安卓项目。这个程序不存储图像,但它将图像从图像转换为文本,然后再转换回来。上面的下载链接包含下面的Kotlin代码版本。

下面是这个类:

代码语言:javascript
复制
package com.example.TestProject;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.util.Log;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.FileChannel;

public class Base64CODEC {
    private int IO_BUFFER_SIZE = 64;
    //private int IO_BUFFER_SIZE = 8192;
    private URL urlObject = null;
    private URLConnection myConn = null;
    ByteArrayOutputStream os = null;

    public void Base64CODEC() {}

    public Bitmap Base64ImageFromURL(String url) {
        Bitmap bitmap = null;
        InputStream in = null;
        BufferedOutputStream out = null;

        try {
            urlObject = new URL(url);
            myConn = urlObject.openConnection();
            in = myConn.getInputStream();

            final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
            out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);

            copyCompletely(in, out);

            final byte[] data = dataStream.toByteArray();
            BitmapFactory.Options options = new BitmapFactory.Options();

            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
        } catch (IOException e) {
            Log.e("TAG", "Could not load Bitmap from: " + url);
        } finally {
            //closeStream(in);
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            //closeStream(out);
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }

        return bitmap;
    }

    private void copyCompletely(InputStream input, OutputStream output) throws IOException {
        // if both are file streams, use channel IO
        if ((output instanceof FileOutputStream) && (input instanceof FileInputStream)) {
            try {
                FileChannel target = ((FileOutputStream) output).getChannel();
                FileChannel source = ((FileInputStream) input).getChannel();

                source.transferTo(0, Integer.MAX_VALUE, target);

                source.close();
                target.close();

                return;
            } catch (Exception e) { /* failover to byte stream version */
            }
        }

        byte[] buf = new byte[8192];
        while (true) {
            int length = input.read(buf);
            if (length < 0)
                break;
            output.write(buf, 0, length);
        }

        try {
            input.close();
        } catch (IOException ignore) {
        }
        try {
            output.close();
        } catch (IOException ignore) {}
    }

    public String convertToBase64(Bitmap bitmap) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG,100,os);
        byte[] byteArray = os.toByteArray();
        return Base64.encodeToString(byteArray, 0);
    }

    public Bitmap convertToBitmap(String base64String) {
        byte[] decodedString = Base64.decode(base64String, Base64.DEFAULT);
        Bitmap bitmapResult = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
        return bitmapResult;
    }

}

下面是使用这个类的主要活动:

代码语言:javascript
复制
package com.example.TestProject;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity implements Runnable {

    private Thread thread = null;
    private Bitmap bitmap = null;
    private Base64CODEC base64CODEC = null;
    private ImageView imgViewSource = null;
    private ImageView imgViewDestination = null;
    private boolean isSourceImageVisible = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void CmdLoadImage_Click(View view) {
        try {
            if(isSourceImageVisible == true) {
                imgViewSource.setImageBitmap(null);
                imgViewDestination.setImageBitmap(null);
                isSourceImageVisible = false;
            }
            else {
                base64CODEC = new Base64CODEC();
                thread = new Thread(this);
                thread.start();
            }
        }
        catch (NullPointerException e) {}

    }

    public void CmdEncodeImage_Click(View view) {
        Base64CODEC base64CODEC = new Base64CODEC();
        try {
            String base64String = base64CODEC.convertToBase64(bitmap);
            imgViewDestination = (ImageView) findViewById(R.id.imgViewDestination);
            Bitmap imgViewDestinationBitmap = base64CODEC.convertToBitmap(base64String);
            imgViewDestination.setImageBitmap(imgViewDestinationBitmap);
        }
        catch (NullPointerException e) {
            //
        }
    }

    @Override
    public void run() {
        bitmap = base64CODEC.Base64ImageFromURL("http://developersfound.com/me.png");
        handler.sendEmptyMessage(0);
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            imgViewSource = (ImageView) findViewById(R.id.imgViewSource);
            imgViewSource.setImageBitmap(bitmap);
            isSourceImageVisible = true;
            thread = null;
        }
    };

}
票数 6
EN

Stack Overflow用户

发布于 2012-02-20 15:47:53

要在sqlite数据库中存储任何图像,您需要将该图像存储在字节数组中,而不是字符串中。将该图像转换为字节数组并将该字节[]存储到DB中。在检索该图像时,您将获得byte []将该byte []转换为位图,您将通过该位图获得原始图像。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9357668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档