Android - SQLiteOpenHelper-如何将图像直接存储到数据库

时间:2015-02-04 05:10:25

标签: java android sqlite bitmap

我有一个SQLite数据库,我直接插入数据,它应该显示为我的app用户的预存数据。我的代码对于一个图像工作正常。但不知道转换和检索图像数组

我试过 Bitmap bitmap = BitmapFactory.decodeResource(getResources()。pmge); 。但是我导致了decodeResource()synatx的错误

   public class MainActivity extends Activity {

Integer [] pmge ={R.drawable.candle1,R.drawable.candl3,
        R.drawable.candl4,R.drawable.candl5,R.drawable.candl6,
        R.drawable.lawn,R.drawable.sglc10,R.drawable.senson,R.drawable.thejus6669};


MyDataBase myDataBase;
SQLiteDatabase database;
Cursor c;
ImageView imageView;
byte[] img,img1;
Bitmap b;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ImageView imageView=(ImageView)findViewById(R.id.imge);
    myDataBase=new MyDataBase(getApplicationContext(),"imagedata",null,1);





                  Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.candle1);
                  ByteArrayOutputStream bos=new ByteArrayOutputStream();
                  bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
                  img=bos.toByteArray();

                  database=myDataBase.getWritableDatabase();


                  Bitmap b1=BitmapFactory.decodeByteArray(img, 0, img.length);
                  imageView.setImageBitmap(b1);
                }
}

class MyDataBase extends SQLiteOpenHelper{
public MyDataBase(Context context, String name, CursorFactory factory,
        int version) {
    super(context, name, factory, version);
    // TODO Auto-generated constructor stub
}

public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("create table tableimage (image BLOB,);");
    db.execSQL("INSERT INTO tableimage(image) VALUES(img) ");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

}

5 个答案:

答案 0 :(得分:0)

你必须使用BLOB格式在Table中存储图像。你应该将Image转换为流然后存储它。我希望这个可以帮助你:)

答案 1 :(得分:0)

您可以使用Blob type。SQL BLOB类型将大量二进制数据(字节)存储为数据库列中的值。

或者

您可以将URI存储到数据库中以获取文件所在位置的参考。

答案 2 :(得分:0)

将您的图像转换为Bitmap,然后将位图转换为byte [],然后将其作为Blob存储在数据库中。

要将位图转换为byte [],您可以使用:

Bitmap yourBitmap;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
yourBitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] bArray = bos.toByteArray();

而不是检索/获取图像

byte[] byteArray = DBcursor.getBlob(columnIndex);  
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length);

答案 3 :(得分:0)

不能将图像直接存储到数据库中,有多种方法可以做到这一点。 e.g

首先,您需要在表格中创建 BLOB 类型的字段。

第二步将图像转换为字节数组。

最后将Byte Array存储/推送到数据库表中数据类型为 BLOB 的特定列

答案 4 :(得分:0)

我建议不要直接在数据库中存储图像。只需将图像存储在特定路径上,并将该图像的路径存储在数据库中。

检查此答案:https://stackoverflow.com/a/3751/1739882

不保留在数据库中存储文件的原因:

  1. 您需要额外的代码才能从数据库中提取和流式传输图像
  2. 您的数据库服务器也会变得很重,而且数据库也会变得很重。