サイズが2.6 GiBを超えるSQLiteデータベースがあります。 (dbにはマップが含まれています。)このdbはRMapsアプリで使用されます。最大ズームでマップを一部に移動すると、アプリが突然終了します。ただし、強制終了メッセージやレポートボタンはありません。だから、私はそれが特定の制限を超えているブロックを読むことによって引き起こされるという考えを持っています。 max(int)。 RMapsは単純なSQLステートメントを使用しているだけなので、問題はRMapsではなく、Android SQLiteドライバーにあると思います。
AndroidでのSQLiteデータベースのサイズ制限はありますか?
(Nexus OneでFroyoを使用していますが、これはFroyoの問題にすぎないと思います)。
ログ出力:
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}
SQLite dbはSDカードに保存され、十分なスペースがあります。
文字列またはBLOBの最大長デフォルトサイズは1 GB最大サイズは2.147483647です
列の最大数デフォルトサイズは2000、最大サイズは32767です。
SQLステートメントの最大長デフォルトサイズは1 MB最大サイズは1.073741824
結合のデフォルトのテーブルの最大数は64テーブルです
接続されているデータベースの最大数デフォルトは10最大サイズは125
テーブルの最大行数最大サイズは18446744073.709552765です
最大データベースサイズ140 TB。ただし、デバイスのディスクサイズによって異なります。
私はそれが2ギガバイトだと思います(32ビットアーキテクチャが原因である可能性がありますが、特定のプログラムにはラージファイルサポートがあり、それ以上のサポートが可能です)。幸いにも Android.database.sqlite.SQLiteDatabase
には、データベースが大きくなる可能性がある最大サイズを返す次のAPI呼び出しがあります。
long getMaximumSize()
最終的には、データベースのシャーディングを調べたくなるかもしれません;)
SQliteにはいくつかの制限( http://www.sqlite.org/limits.html )があり、どのデータベースでも使用できます。やってみました vaccum;
この特定のデータベースを使用しますか?それは構造を再構築します。ある程度の破損があるか、DBがエクスプロイトベクターにならないようにするためにコンパイルされている他の制限の1つに達しています。
私はこれについてしっかりした情報を得るのに苦労しましたが、非常に多くの変数があります。このデモXamarinアプリを使用すると、独自のJSONオブジェクトの例を、停止するまで何度でも繰り返しSQLiteデータベースに追加できます。データベースのサイズとアプリのパフォーマンスの両方への影響を確認できます。それは粗雑ですが、私の目的を十分に果たします。うまくいけば、これは他の誰かを助けることができるか、あなたはそれを拡張することができます。あなたはそれを見つけることができます ここ 。