2011-07-26 10 views
15

Así que recientemente cambié mi material de base de datos a ORMLite en mi aplicación para tableta Android que estoy escribiendo. Hasta ahora todo bien, obtuve la mayoría de las cosas refactored/recoded. Aunque tengo problemas con lo que originalmente estaba almacenado en la base de datos como BLOB. En mi modelo de datos original se veía así:ORMLite e imágenes guardadas como BLOB en Android

byte[] imageBytes; 

pero no creo que pueda usar que, en ORMLite, mejor que podría decir que tiene que ser una cadena así que ahora tengo:

@DatabaseField 
String picture; 

Pero ahora, estoy confundido en cuanto a cómo leer y escribir los datos de bits como bytes, etc ... que estaba usando código como este para transportar datos hacia y desde la base de datos:

... 
//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);  

Así que ahora que es cómo estaba guardando la imagen, no soy su ¿Cómo puedo hacer esto si no hay BLOB en el ORMLite y tengo que usar cadenas?

para la integridad Así es como me gustaría visualizar la imagen:

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

Entonces, ¿qué tengo que hacer para conseguir estas imágenes dentro y fuera de la base de datos, y es el tipo de campo de cadena correcta para una "Blob"?

Respuesta

22

De hecho, puede almacenar byte[] campos en ORMLite. Para citar el manual about byte arrays:

Matriz de bytes (byte []) persistió como tipo SQL VARBINARIO. Esto es diferente del tipo DataType.SERIALIZABLE que serializa un objeto como una matriz de bytes.

NOTA: Debido a la compatibilidad con versiones anteriores, cualquier campo que sea de tipo byte [] se debe especificar como DataType.BYTE_ARRAY o DataType.SERIALIZABLE usando el campo de tipo de datos y no se detectará automáticamente.

lo tanto, para utilizar byte [] tendrá que especificar el tipo de los datos:

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

El truco es que ORMLite no detecta automáticamente el tipo de la byte[] debido a alguna compatibilidad con versiones anteriores cuestiones.

+1

Ahh lo tengo, por alguna razón, tomó el renderscript DataType, pero tenía que calificar completamente el nombre y todo estaba bien. ¡Gracias! – Codejoy

+1

+1 Agradable ... me salvó el tiempo –

+0

@Gray ¿sabe cómo configurar el byte [] en el archivo ormlite_config.txt? porque he agregado esta línea al archivo # --field-start-- fieldName = image1 # --field-end-- pero me da una excepción de tiempo de ejecución cuando trato de guardar archivos en db –

Cuestiones relacionadas