¿Cuál es el tamaño máximo de la base de datos SQLite en Android?

Tengo un DB de SQLite que el tamaño es más de 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, por ejemplo, max (int). Como RMaps solo usa sentencias SQL simples, creo que el problema no está en los RMaps sino en el controlador Android SQLite.

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

(Tengo Froyo en Nexus One, pero no creo que este sea solo un problema de Froyo).

Salida de registro:

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} 

El archivo SQLite db se almacena en la tarjeta SD, hay suficiente espacio.

Longitud máxima de una cadena o BLOB El tamaño predeterminado es 1 GB El tamaño máximo es 2.147483647

Número máximo de columnas El tamaño predeterminado es 2000 El tamaño máximo es 32767

Longitud máxima de una instrucción SQL El tamaño predeterminado es 1 MB El tamaño máximo es 1.073741824

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

Número máximo de bases de datos adjuntas El valor predeterminado es 10 El tamaño máximo es 125

Número máximo de filas en un tamaño máximo de tabla es 18446744073.709552765

Tamaño máximo de la base de datos de 140 tb, pero dependerá del tamaño del disco del dispositivo.

Sospecho que son ~ 2 gigabytes (que pueden deberse a la architecture de 32 bits, aunque ciertos progtwigs vienen con soporte para archivos grandes, permitiendo más que eso). Afortunadamente, android.database.sqlite.SQLiteDatabase tiene la siguiente llamada API que devuelve el tamaño máximo que la base de datos puede crecer:

 long getMaximumSize() 

Con el tiempo, es posible que desee examinar la fragmentación de la base de datos;)

SQlite tiene varios límites ( http://www.sqlite.org/limits.html ) que pueden entrar en juego con cualquier base de datos. ¿Has probado el vaccum; ing 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 comstackdos que están allí para asegurarse de que el DB no se convierta en un vector de explotación.

Luché 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. Puedes encontrarlo aquí .