2010-08-14 18 views
24

Tengo un SQLite db que tiene un tamaño superior a 2.6 GiB. (El db contiene mapas.) Este db es utilizado por la aplicación RMaps. Cuando mueva los mapas a algunas partes con el zoom máximo, la aplicación se cierra de repente. Sin embargo, no hay ningún mensaje de cierre forzado ni botón de informe. Entonces, tengo una idea de que es causada por bloques de lectura que están más allá de un cierto límite, p. max (int). Como RMaps solo usa sentencias SQL simples, creo que el problema no está en los RMaps sino en el controlador Android SQLite.¿Cuál es el tamaño máximo de la base de datos SQLite en Android?

¿Existe un límite de tamaño de la base de datos SQLite en Android?

(tengo Froyo en Nexus One, pero no creo que esto es sólo un problema de Froyo.) Salida de

Log:

08-14 10:24:51.689 I/ActivityManager( 81): Starting activity: Intent { act=android.intent.action.SEARCH flg=0x10000000 cmp=com.robert.maps/.MainMapActivity (has extras) } 
08-14 10:25:01.879 E/AndroidRuntime(12441): FATAL EXCEPTION: pool-1-thread-2 
08-14 10:25:01.879 E/AndroidRuntime(12441): android.database.sqlite.SQLiteDiskIOException: disk I/O error 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at android.database.sqlite.SQLiteQuery.native_fill_window(Native Method) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:70) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:283) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:264) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at com.robert.maps.utils.CashDatabase.getTile(CashDatabase.java:49) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at org.andnav.osm.views.util.OpenStreetMapTileFilesystemProvider$7.run(OpenStreetMapTileFilesystemProvider.java:501) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
08-14 10:25:01.879 E/AndroidRuntime(12441):  at java.lang.Thread.run(Thread.java:1096) 
08-14 10:25:01.889 I/ActivityManager( 81): Process com.robert.maps (pid 12441) has died. 
08-14 10:25:01.899 I/WindowManager( 81): WIN DEATH: Window{45131410 com.robert.maps/com.robert.maps.MainMapActivity paused=false} 

DB SQLite se almacena en la tarjeta SD, hay suficiente espacio

+0

Intente almacenar el db en la tarjeta SD – Falmarri

+0

Está en la tarjeta SD. –

+0

límite de fat32 en sdcard? –

Respuesta

10

Sospecho que es ~ 2 gigabytes (que puede deberse a la arquitectura de 32 bits, aunque ciertos programas vienen con soporte de gran tamaño, permitiendo más que eso). Afortunadamente android.database.sqlite.SQLiteDatabase tiene tras llamada a la API que devuelve el tamaño máximo de la base de datos puede crecer a:

long getMaximumSize() 

Con el tiempo es posible que desee ver en sharding base de datos;)

+0

2 GB podría ser el caso para un archivo ejecutable en una máquina de escritorio normal, pero en un dispositivo móvil Android creo que es limitado; No conozco el límite, pero he tenido problemas similares y supongo que es algo así como de 4 a 6 MB, sin importar si el db está en la tarjeta SD o en el almacenamiento interno. –

+7

El 'getMaximumSize()' devuelve 1 TB. –

+0

Tengo la duda de que si el archivo sqlite es externo en Android, ¿cuál será el límite? ¿Es lo mismo que en el escritorio o todavía hay alguna limitación? – Vinay

3

SQlite tiene varios límites (http://www.sqlite.org/limits.html) que pueden entrar en jugar con cualquier base de datos. ¿Has probado vaccum; en esta base de datos en particular? Reconstruirá las estructuras. Puede tener algún nivel de corrupción o ha tocado uno de los otros límites compilados que están allí para asegurarse de que el DB no se convierta en un vector de explotación.

9

Longitud máxima de un tamaño de cadena o BLOB por defecto es 1 GB de tamaño máximo es de 2,147483647

máximo número de columnas tamaño predeterminado es de 2.000 Tamaño máximo se 32767

Longitud máxima de una instrucción predeterminada de SQL es 1 tamaño MB Max es 1,073741824

número máximo de tablas en una combinación predeterminada es de 64 mesas

número máximo de bases de datos asociadas por defecto es 10 tamaño máximo es de 125

número máximo de filas en una tabla Tamaño máximo es 18446744073,709552765

Tamaño máximo de la base de datos 140 tb, pero lo hará depende del tamaño de su disco dispositivo.

+0

¿Qué pasa si la aplicación llega a estos límites? – max

+5

Es una buena información. ¿Puedes decirnos la fuente de esta información? –

+1

@srv_sud http://www.sqlite.org/limits.html – Saj

1

Tuve problemas para obtener información sólida sobre esto, pero hay muchas variables. Esta aplicación demo Xamarin le permite agregar un ejemplo de su propio objeto JSON a una base de datos SQLite repetidamente tan rápido como desee hasta que lo detenga. Permitiéndole ver los efectos tanto en el tamaño de la base de datos como en el rendimiento de la aplicación. Es crudo pero sirve mis propósitos y espero que esto pueda ayudar a alguien más o puede ampliarlo. Puede encontrarlo here.

Cuestiones relacionadas