2010-08-14 3 views
24

Ich habe eine SQLite-Datenbank, die Größe ist über 2,6 GiB. (Die Datenbank enthält Karten.) Diese Datenbank wird von RMaps App verwendet. Wenn Sie die Karten bei maximalem Zoom auf einige Teile verschieben, wird die App plötzlich geschlossen. Es gibt jedoch keine Force-Close-Nachricht, keine Berichtschaltfläche. Ich habe also eine Idee, dass es durch das Lesen von Blöcken verursacht wird, die eine bestimmte Grenze überschreiten, z. max (int). Da RMaps nur einfache SQL-Anweisungen verwendet, denke ich, dass das Problem nicht in RMaps, sondern in Android SQLite-Treiber liegt.Was ist eine maximale Größe der SQLite-Datenbank auf Android?

Gibt es eine Größenbeschränkung der SQLite-Datenbank auf Android?

(Ich habe Froyo auf dem Nexus One, aber ich glaube nicht, dass dies nur ein Problem der Froyo ist.)

Protokollausgabe:

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} 

Die SQLite db auf SD-Karte gespeichert ist, Es ist genug Platz.

+0

Versuchen Sie, die db auf der SD-Karte zu speichern – Falmarri

+0

Es ist auf der SD-Karte. –

+0

fat32 limit in sdcard? –

Antwort

10

Ich vermute, es ist ~ 2 Gigabyte (das könnte wegen der 32-Bit-Architektur sein, obwohl bestimmte Programme mit largefile Unterstützung kommen, die mehr als das erlaubt). Zum Glück hat android.database.sqlite.SQLiteDatabase Aufruf folgende API, die die maximale Größe gibt die Datenbank wachsen kann:

long getMaximumSize() 

Schließlich möchten Sie vielleicht in Datenbank sharding sehen;)

+0

2 GB könnte für eine db auf einem normalen Desktop-Rechner gelten, aber auf einem Android-Gerät ist es meiner Meinung nach begrenzt; Ich kenne das Limit nicht, aber ich habe ähnliche Probleme erlebt und würde raten, dass es ungefähr 4-6 MB ist - egal ob die DB auf SD-Karte oder internem Speicher ist. –

+7

Das 'getMaximumSize()' gibt 1 TB zurück. –

+0

Ich habe Zweifel, dass, wenn die SQLite-Datei extern in Android ist, was wird das Limit sein? Ist es dasselbe wie Desktop oder gibt es immer noch eine Einschränkung? – Vinay

3

SQlite mehrere Grenzen hat (http://www.sqlite.org/limits.html), die in kommen kann Spiel mit jeder Datenbank. Haben Sie versucht vaccum; in dieser bestimmten Datenbank? Es wird die Strukturen wieder aufbauen. Sie könnten ein gewisses Maß an Korruption haben oder Sie haben eines der anderen kompilierten Limits erreicht, die vorhanden sind, um sicherzustellen, dass die Datenbank kein Exploit-Vektor wird.

9

Maximale Länge eines Strings oder BLOB Standardgröße ist 1 GB Max Größe 2,147483647

maximale Anzahl von Spalten Standardgröße ist 2000 Max Größe ist 32767

maximale Länge einer SQL-Anweisung Standardgröße ist 1 MB Max Größe ist 1,073741824

maximale Anzahl von Tabellen in einem Join Standard ist 64 Tabellen

Maximale Anzahl der angeschlossenen Datenbanken Standard ist 10 Max Größe beträgt 125

maximale Anzahl der Zeilen in einer Tabelle Max Größe ist 18446744073,709552765

maximale Datenbankgröße 140 tb aber es wird, hängt von Ihrem Gerät Plattengröße.

+0

Was passiert, wenn die App diese Grenze erreicht? – max

+5

Es ist eine nette Information. Können Sie uns bitte die Quelle dieser Info mitteilen? –

+1

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

1

Ich hatte Probleme mit soliden Informationen, aber es gibt so viele Variablen. Mit dieser Demo-Xamarin-App können Sie so oft wie gewünscht ein Beispiel für Ihr eigenes JSON-Objekt zu einer SQLite-Datenbank hinzufügen, bis Sie es beenden. Sie können die Auswirkungen sowohl auf die Größe der Datenbank als auch auf die Leistung der App sehen. Es ist grob, aber dient meinen Zwecken gut und hoffentlich kann das jemand anderem helfen, oder Sie können es erweitern. Sie können es finden here.