2011-03-23 10 views
14

Descargo un db de Internet. Lo guardo en mi carpeta de datos y lo abro. Dentro de la base de datos hay una tabla "Anuncios" con 6 campos. 2 de estos campos son BLOB. Cuando quiero leer en esta tabla ... Tengo un problema ... Noté que cuando leo una fila con un campo de blob más grande que 1 mega byte, esto causa una excepción ... "obtener el campo de la ranura 0 col 0 fallido ". si es un poco blob, todo está bien ... gracias de antemano :)Límite de tamaño de cursor en Android SQLiteDatabase

Respuesta

39

Hay un límite de 1MB en los recursos internos debido a la descompresión dinámica; el límite de 1 MB también parece aplicarse a los blobs del Cursor, pero esto no parece estar documentado en ninguna parte.

En general, debe evitar blobs en SQLite, ya que tienen un bajo rendimiento; en su lugar, guarde los datos de blob como un archivo y almacene la ubicación del archivo en su base de datos.

+1

En general, debe evitar blobs en SQLite, ya que funcionan mal; en su lugar, guarde los datos de blob como un archivo y almacene la ubicación del archivo en su base de datos. ---> Muchas gracias .. –

+0

AndroidKid está en lo cierto. Estoy seguro de que existe un caso de uso de BLOB, sin embargo, no puedo pensar en uno. :) – Jonathan

1

¿La consulta que está utilizando 'selecciona' dijo blob? ¿Puedes omitirlo? Si no puedes, estás usando:

blob = rs.getBlob(column) ; 
InputStream in = blob.getBinaryStream(); 

o

blob.getBytes(1, lengthOblob) ; 

El primer método le permitirá leer la burbuja en trozos. El segundo va a tener la burbuja cargada de una vez.

+0

No estoy seguro de lo que quiere decir con "cargado de una vez". Dado que 'getBlob()' devuelve un 'byte []', los datos ya están allí en el montón ... – vaughandroid

+4

Suponiendo que 'rs' es un Cursor, esa primera llamada a getBlob() fallará en datos grandes debido a el tamaño de la ventana del cursor. – sgibly

1

miradas como apoyo BLOB de Android aún no está implementado ...

http://www.basic4ppc.com/forum/basic4android-updates-questions/6648-support-sqlite-blob.html

¿Qué datos se almacenan en los campos BLOB? Yo adivinaría fotos.

Recomendaría NO usar BLOB. El sistema de archivos es una opción mucho mejor para los datos binarios.

¿Puede explicarnos un poco más sobre lo que quiere lograr con la base de datos?

+0

Mejor respuesta: No use BLOB en * cualquier * base de datos.Los RDBM no son especialmente adecuados para almacenar grandes piezas de datos sin formato; para eso es un sistema de archivos. –

+0

@David Souther Gracias por el comentario, tienes razón. Me gustaría pensar que los BLOB son útiles para algo, por eso fui un poco menos definitivo. Sin embargo, no puedo pensar en un buen caso de uso. ¿Almacena películas BluRay? (bromeando) – Jonathan

+1

Esa publicación es de 2007. Los BLOB definitivamente son compatibles, y lo han sido desde al menos 1.6 (a.k.a. nivel de API 4, a.k.a. Donut). El problema es con valores BLOB de más de 1MB, como señaló OP. –

8

Hay un límite de 1 MB por operación. (No estoy seguro si esto es por fila, o por columna en el caso de consultas SQLite). El límite se debe a que la API SQLite interactúa con sqlite fuera de proceso en el sistema Binder/Parcel IPC. El mismo límite se aplica a los valores dentro de un paquete (por ejemplo, extras de uso).

La memoria intermedia de transacciones aglutinante tiene un tamaño limitado fija, actualmente 1Mb, que es compartida por todas las transacciones en curso para el proceso.

Ver: http://developer.android.com/reference/android/os/TransactionTooLargeException.html

+1

El límite de 1 MB es el tamaño máximo de la ventana del Cursor. Este es el buffer de memoria usado para almacenar filas de resultados para transferencias IPC. El tamaño de la ventana crece dinámicamente hasta este límite. – WindRider

11

Lectura de un BLOB que es menos de 100 KB a partir de una base de datos SQLite es más rápido que la lectura de la misma desde el sistema de archivos. Sin embargo, cualquier cosa mayor que eso se conserva mejor en el disco, con una referencia en el db. Más información en: http://www.sqlite.org/intern-v-extern-blob.html

+1

Gracias por la referencia. –

+1

@frederick nyawaya: ¿cuál sería el mejor? ¿almacenar imágenes/audio como una BLOB en la base de datos o simplemente almacenar la ruta del sistema de archivos? – Ajay

+0

@Ajay como parte del sistema de archivos –

Cuestiones relacionadas