#android #android-studio #android-sqlite
#Android #android-studio #android-sqlite
Вопрос:
Я пытаюсь получить изображение из галереи и сначала преобразовать его в растровое изображение из URI, затем преобразовать его в массив байтов, а затем попытаться сохранить его в базе данных столбца типа данных BLOB. Запрос Insert возвращает успешное сообщение, но не отражается в базе данных. Но когда я передаю в него пустой массив байтов, он сохраняет всю строку.
Код растрового изображения в байт [] :
byte[] imgByteArray;
int size = bitmap.getRowBytes() * bitmap.getHeight();
ByteBuffer byteBuffer = ByteBuffer.allocate(size);
bitmap.copyPixelsToBuffer(byteBuffer);
imgByteArray = byteBuffer.array();
Обновить :
КОД ДЛЯ ПОЛУЧЕНИЯ ИЗОБРАЖЕНИЯ ИЗ ГАЛЕРЕИ И ПРЕОБРАЗОВАНИЯ БАЙТОВ И СОХРАНЕНИЯ В БД :
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_PICTURE);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == PICK_PICTURE) {
if (data.getData() != null) {
Uri uri = data.getData();
try {
pictureBitmap = getBitmapFromUri(uri);
byte[] imgByteArray;
int size = pictureBitmap.getRowBytes() * pictureBitmap.getHeight();
ByteBuffer byteBuffer = ByteBuffer.allocate(size);
pictureBitmap.copyPixelsToBuffer(byteBuffer);
imgByteArray = byteBuffer.array();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public boolean insertPicture(byte[] picture, String desc){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cValues = new ContentValues();
cValues.put(KEY_PICTURE, picture);
cValues.put(KEY_DESC, desc);
long rowId = db.insert(PICTURE_TABLE,null, cValues);
Log.d("TAG","Row ID : " rowId);
db.close();
if(rowId!=0){
return true;
}else {
return false;
}
}
Комментарии:
1. пожалуйста, укажите код, который вы используете для получения изображения из галереи, сохранения этого изображения в базе данных и извлечения его из базы данных
2. Я обновил вопрос с помощью кода. Пожалуйста, взгляните. Спасибо
3.
trying to get image from gallery and convert it into Bitmap first
Это выглядит как плохая идея. Особенно потому, что вы хотите поместить все его пиксели в массив перед сохранением. Это будет стоить вам много места для хранения. Вероятно, более чем в двадцать раз больше по сравнению с тем, когда вы только что сохранили выбранный файл jpg.4. @blackapps Ооо, я этого не знал. Итак, с вашей точки зрения, для лучшего управления памятью, каков наилучший способ добиться этого?
5. Это я вам уже говорил: сохраните -байты — самого выбранного файла jpg. Не используйте промежуточное растровое изображение.
Ответ №1:
В методе onActivityResult:
Uri uri = data.getData();
InputStream inStream = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(inStream);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, outStream);
byte[] imgBytes = outStream.toByteArray();
SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = "INSERT INTO YOURTABLENAME (id,image) VALUES(?,?)";
SQLiteStatement statement = db.compileStatement(sql);
statement.clearBindings();
statement.bindString(1, Integer.toString(someId));
statement.bindBlob(2, imgBytes);
statement.executeInsert();
db.close();
я рекомендую вам сохранить ваши байты изображения с идентификатором, чтобы затем их легко получить
Комментарии:
1. Вы конвертируете файл изображения jpg в изображение png. Png занимают больше памяти. Обычно хотелось бы использовать как можно меньше памяти.
2. вы правы, но я думаю, что вопрос был о том, как это сделать, а не о том, как сделать это наилучшим образом)
3. @alex-rmcf то есть вы имеете в виду, что я должен устанавливать изображения таким образом? Не могу использовать метод, который я использую прямо сейчас? Я имею в виду db. Метод вставки?
4. Поэтому, если я хочу использовать этот способ: SQLiteDatabase db = this.getWritableDatabase(); ContentValues cValues = new ContentValues(); cValues.put(KEY_PICTURE, picture); cValues.put(KEY_DESC, desc); long rowId = db.insert(PICTURE_TABLE,null, cValues); Log.d(«TAG»,»Row ID: » rowId); db.close(); if(rowId!=0){ return true; }else { return false; } Я не могу его использовать?
5. и в соответствии с инструкцией perfomance — using выполняется быстрее, чем значения содержимого.