ORMLite и изображения, сохраненные как BLOB на Android - PullRequest
15 голосов
/ 27 июля 2011

Итак, я недавно переключил свою базу данных на ORMLite в своем приложении для планшета 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 нет BLOB-объектов и мне нужно использовать строки?

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

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 Ответ

23 голосов
/ 27 июля 2011

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

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

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

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

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

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

...