ORMLite и изображения, сохраненные как BLOB на Android

Итак, я недавно переключил свою базу данных на ORMLite в своем приложении для Android Android, которое я пишу. До сих пор так хорошо, что большинство вещей реорганизовано/перекодировано. Хотя у меня возникают проблемы с тем, что было первоначально сохранено в базе данных как BLOB. В моей исходной модели данных это выглядело так:

byte[] imageBytes;

но я не думаю, что могу использовать это в ORMLite, лучше сказать, что это должна быть строка, так что теперь у меня есть:

@DatabaseField
String picture;

Но теперь я смущен тем, как читать и записывать эти биты данных в виде байтов и т.д. Я использовал такой код для пересылки данных в базу данных и из нее:

...
//Set the clients image to what was captured...
Bitmap resized2= android.graphics.Bitmap.createScaledBitmap(thumbnail, thumbnail.getWidth()/2, thumbnail.getHeight()/2, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
resized2.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object   
byte[] b = baos.toByteArray();  

mClient.setImageBytes(b);
myImage.setImageBitmap(resized2);
//do save to the database of the image to the blob whose column is picture
ContentValues initialValues = new ContentValues();
initialValues.put("picture", mClient.getImageBytes());
String [] strArray = {""+sid};
long n = dbAdapter.updateRecordsInDB("clients", initialValues, "_id=?", strArray);      

Итак, теперь, как я сохранял изображение, я не уверен, как это сделать, если в ORMLite нет BLOBS, и мне нужно использовать строки?

для полноты это то, как я бы отображал изображение:

if(mClient.getImageBytes().length <= 1) //no image in database, thats fine use generic
    myImage.setImageResource(R.drawable.sillo); // create a sillouhtette face icon here...
else
    myImage.setImageBitmap((BitmapFactory.decodeByteArray(mClient.getImageBytes(),0, (mClient.getImageBytes()).length)));

Итак, что мне нужно сделать, чтобы получить эти изображения в и из базы данных и является ли тип поля String правильным для "Blob"?

Ответы

Ответ 1

Вы действительно можете хранить поля byte[] в ORMLite. Чтобы процитировать руководство о байтовых массивах:

Массив байтов (байт []) сохраняется как тип VARBINARY типа SQL. Это отличается от типа DataType.SERIALIZABLE, который сериализует объект как массив байтов.

ПРИМЕЧАНИЕ. Из-за обратной совместимости любые поля, которые имеют тип байта [], должны быть указаны как DataType.BYTE_ARRAY или DataType.SERIALIZABLE с использованием поля dataType и не будут автоматически обнаружены.

Итак, для использования байта [] вам нужно будет указать тип данных:

@DatabaseField(dataType = DataType.BYTE_ARRAY)
byte[] imageBytes;

Фокус в том, что ORMLite не обнаруживает тип byte[] автоматически из-за некоторых проблем с обратной совместимостью.