Android上的SQLite数据库的最大大小是多less?

我有一个大小超过2.6吉比特的SQLite数据库。 (数据库包含地图。)这个数据库是由RMaps应用程序使用的。 当以最大缩放比例将地图移动到某些部分时,应用程序会突然closures。 但是,没有强制closures消息,没有报告button。 所以,我有一个想法,它是由超出一定的限制,如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数据库存储在SD卡上,有足够的空间。

我怀疑它是~2千兆字节(这可能是由于32位体系结构,尽pipe某些程序带有大文件支持,允许更多)。 幸运的是, android.database.sqlite.SQLiteDatabase具有以下API调用,返回数据库可能增长的最大大小:

 long getMaximumSize() 

最终你可能想看看数据库分片;)

string或BLOB的最大长度默认大小为1 GB最大大小为2.147483647

最大列数默认大小是2000最大大小是32767

SQL语句的最大长度默认大小为1 MB最大大小为1.073741824

“join默认”中的最大表数是64个表

最大连接数据库数量默认值为10最大大小为125

表中最大行数最大值为18446744073.709552765

最大数据库大小140 tb,但它将取决于您的设备磁盘大小。

SQlite有几个限制( http://www.sqlite.org/limits.html )可用于任何数据库。 你试过vaccum;vaccum; 这个特定的数据库? 它会重build结构。 你可能有一定程度的腐败,或者你已经达到了其他编译​​的限制之一,以确保数据库不会成为一个利用向量。

我努力获得可靠的信息,但有这么多的变数。 这个演示Xamarin应用程序允许您将您自己的JSON对象的示例反复添加到SQLite数据库中,直到您停止它为止。 允许您查看对数据库大小和应用程序性能的影响。 这很简单,但为我的目的服务,希望这可以帮助别人,或者你可以扩大它。 你可以在这里find它。