Сохранение изображения на sqlite с камеры или галереи - PullRequest
0 голосов
/ 02 декабря 2011

Я борюсь с сохранением изображения на sqlite.Я пытаюсь сохранить изображение как blob на sqlite.Я не знаю, как объявить imageView в byte[], потому что я использую метод вставки в dbAdapter.Это хороший способ сохранить изображение в базу данных?некоторые люди говорят, что лучше сохранить путь к файлу в базе данных.Если это лучше, пожалуйста, дайте мне свои руки.Я действительно становлюсь жестким для этого.Большое спасибо.

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

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Для вашей другой части вопроса о камере этот фрагмент кода будет полезен.

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

}

Посмотрите на это

1 голос
/ 02 декабря 2011

Попробуйте сделать это:

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 будет, вероятно, более эффективным, если пользователь удалит изображение, которое вам придется обрабатывать в приложении.

...