web-dev-qa-db-fra.com

Quelle est la taille maximale de la base de données SQLite sur Android?

J'ai une base de données SQLite dont la taille est supérieure à 2,6 Gio. (La base de données contient des cartes.) Cette base de données est utilisée par l'application RMaps. Lorsque vous déplacez les cartes vers certaines parties au zoom maximal, l'application se ferme soudainement. Cependant, il n'y a pas de message de fermeture forcée, pas de bouton de rapport. Donc, j'ai une idée que cela est causé par la lecture de blocs qui dépassent une certaine limite, par exemple max (int). Étant donné que RMaps utilise simplement des instructions SQL simples, je pense que le problème n'est pas dans RMaps mais plutôt dans Android pilote SQLite.

Existe-t-il une taille limite pour la base de données SQLite sur Android?

(J'ai Froyo sur Nexus One, mais je ne pense pas que ce soit juste un problème de Froyo.)

Sortie du journal:

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}

La base de données SQLite est stockée sur la carte SD, il y a suffisamment d'espace.

30
TN.

La longueur maximale d'une chaîne ou d'un BLOB La taille par défaut est de 1 Go La taille maximale est de 2.147483647

Nombre maximum de colonnes La taille par défaut est 2000 La taille maximale est 32767

Longueur maximale d'une instruction SQL La taille par défaut est de 1 Mo. La taille maximale est de 1,073741824.

Le nombre maximum de tables dans une jointure par défaut est de 64 tables

Nombre maximum de bases de données attachées La valeur par défaut est 10 La taille maximale est 125

Le nombre maximum de lignes dans une table est de 18446744073,709552765

Taille maximale de la base de données 140 To, mais cela dépend de la taille du disque de votre appareil.

16
Pravin Bhosale

Je soupçonne que c'est ~ 2 gigaoctets (cela pourrait être dû à l'architecture 32 bits, bien que certains programmes soient livrés avec un support de gros fichiers, ce qui permet plus que cela). Heureusement Android.database.sqlite.SQLiteDatabase a l'appel d'API suivant qui renvoie la taille maximale de la base de données:

long getMaximumSize()

Finalement, vous voudrez peut-être examiner le partage de bases de données;)

11
plaes

SQlite a plusieurs limites ( http://www.sqlite.org/limits.html ) qui peuvent entrer en jeu avec n'importe quelle base de données. As-tu essayé vaccum;ing cette base de données particulière? Il reconstruira les structures. Vous pourriez avoir un certain niveau de corruption ou vous avez atteint l'une des autres limites compilées qui sont là pour garantir que la base de données ne devienne pas un vecteur d'exploitation.

3
Kitson

J'ai eu du mal à obtenir des informations solides à ce sujet, mais il y a tellement de variables. Cette application de démonstration Xamarin vous permet d'ajouter un exemple de votre propre objet JSON à une base de données SQLite à plusieurs reprises aussi rapidement que vous le souhaitez jusqu'à ce que vous l'arrêtiez. Vous permettant de visualiser les effets à la fois sur la taille de la base de données et les performances de l'application. C'est grossier mais cela sert bien mes objectifs et j'espère que cela peut aider quelqu'un d'autre ou vous pouvez développer cela. Vous pouvez le trouver ici .

1
Helzgate