2011-12-02 40 views
0

我很努力地在sqlite上保存图像。 我想将图像保存为sqlite上的blob。 我不知道如何声明imageViewbyte[],因为我在dbAdapter上使用插入方法。 将图像保存到数据库是否好方法?有人说将文件路径url保存到数据库中会更好。如果更好,请给我一些你的手。 我真的越来越难。 非常感谢。从相机或图库在sqlite上保存图像

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode != RESULT_OK) return; 
     switch (requestCode) 
     { 
     case PICK_FROM_CAMERA: 
     Bundle extras = data.getExtras(); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     Bitmap selectedImage = (Bitmap) extras.get("data"); 
     selectedImage = Bitmap.createScaledBitmap(selectedImage, 200, 250, false); 
     selectedImage.compress(CompressFormat.PNG, 0, bos); 
     mImageView.setImageBitmap(selectedImage); 
     break; 

     case PICK_FROM_GALLERY: 
      Uri selectedImageUri = data.getData(); 
      selectedImagePath = getPath(selectedImageUri); 
      System.out.println("Image Path : " + selectedImagePath); 
      mImageView.setImageURI(selectedImageUri); 
     break; 
     } 
} 

protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    saveState(); 
} 

private void saveState() 
{ 
    String name = (String) nameEdit.getText().toString(); 
    String category = (String) categoryEdit.getText().toString(); 
    String expired_date = (String) expired_Date_Btn.getText().toString(); 
    //byte[] image = (byte[]) mImageView... I HAVE TO DO SOME CODING HERE.. 
    if(mRowId == null) 
    { 
     long id = mDbHelper.insertItem(category, name, expired_date, image); 

     if(id>0) 
     { 
      mRowId = id; 
     }   
    } 
    else 
    { 
     mDbHelper.updateItem(mRowId, category, name, expired_date, image); 
    } 
} 

将对DBAdapter类

public long insertItem(String category, String name, String expired_date, byte[] image) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_CATEGORY, category); 
    initialValues.put(KEY_NAME, name); 
    initialValues.put(KEY_EXPIRED_DATE, expired_date); 
    initialValues.put(KEY_IMAGE, image); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

回答

1

试着这样做:

ConvertDrawableToByteArray(mImageView.getDrawable() 

随着ConvertDrawabelToByteArray定义是这样的:

public static byte[] ConvertDrawableToByteArray(Drawable drawableResource) { 

    Bitmap imageBitmap = ((BitmapDrawable) drawableResource).getBitmap(); 
    ByteArrayOutputStream imageByteStream = new ByteArrayOutputStream(); 
    imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, imageByteStream); 
    byte[] imageByteData = imageByteStream.toByteArray(); 
    return imageByteData; 
} 

虽然我认为你应该能够得到字节超出位地图。所有这一切说,在sql lite中存储文件路径可能会更有效,但是,如果用户删除了图像,则必须在应用程序中处理该图像。

+0

感谢您的回复,这是为我好。但是,仍然我的应用程序不能处理数据库与图像:( – wholee1

+0

你可以展开你的意思是它不会处理图像? – Chris

+0

我认为DbAdapter有问题,因为图像列无法得到它。在dbAdapter中,我创建图像列为blob类型,但是,sqlite目前无法获得blob列,我不知道它是什么问题,当我运行应用程序时,它不能从数据库中获取项目,然后我仍然在为保存图像而苦苦挣扎给出了答案.. – wholee1

2

对于有关相机问题的其他部分,这段代码将会很有帮助。

buttonClick = (Button) findViewById(R.id.buttonClick); 
buttonClick.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 
}); 

myDBHelper = new MyDBHelper(this); 
readDatabase(); 
} 

protected void newTab(String label, Drawable icon, int page) { 
    TabSpec tabSpec = tabHost.newTabSpec(label); 
    tabSpec.setIndicator(label,icon); 
    tabSpec.setContent(page); 
    tabHost.addTab(tabSpec); 
} 

// Called when shutter is opened 
ShutterCallback shutterCallback = new ShutterCallback() { 
    public void onShutter() { 
    } 
}; 

// Handles data for raw picture 
PictureCallback rawCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
    } 
}; 

// Handles data for jpeg picture 
PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 

     SQLiteDatabase db = myDBHelper.getReadableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put("image", data); 
     db.insert("storedImages", "tag", values); 
     preview.camera.startPreview(); 
    } 
}; 

protected void readDatabase() { 
    TextView info = (TextView) findViewById(R.id.info); 
    info.setText("Integer.toString(cursor.getCount())"); 
    SQLiteDatabase db = myDBHelper.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT * FROM storedImages ;", null); 

    info.setText(Integer.toString(cursor.getCount())); 

    if (cursor.getCount()>0) { 
     cursor.moveToNext(); 
     ImageView image = (ImageView) findViewById(R.id.image); 
     byte[] data = cursor.getBlob(cursor.getColumnIndex("image")); 
     image.setImageBitmap(BitmapFactory.decodeByteArray(data, 0, data.length)); 
    } 
} 

} 

Have a look at this

+1

你可以检查这个链接的一些有用的建议关于,什么会更好的方式来保存图像在SQLite数据库.http://stackoverflow.com/questions/8119162/how -to-STORE-图像功能于源码数据库和 - 显示它们 – mH16

相关问题