安卓上SQLite数据库的最大尺寸是多少?

33

我有一个大小超过2.6 GiB的SQLite数据库(包含地图)。

这个数据库被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数据库存储在SD卡上,有足够的空间。


尝试将数据库存储在SD卡上。 - Falmarri
4个回答

20

字符串或二进制数据(BLOB)的最大长度,默认大小为1 GB,最大大小为2.147483647。

列的最大数量,默认大小为2000,最大大小为32767。

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

联接中允许的最大表数为64个表。

附加数据库的最大数量默认为10,最大为125。

表中行的最大数量最大大小为18446744073.709552765。

数据库的最大大小为140 TB,但这取决于您设备的磁盘大小。


1
如果应用程序达到了这个限制,会发生什么? - max
9
这是一个不错的信息。请问您能告诉我们这个信息的来源吗? - srv_sud
2
@Pravin,这个问题是在问实际上的极限,而不是理论上的极限。 - Pacerier
指定的限制适用于sqlite,由于设备存储与所述限制不同,因此在ormlite的情况下,最大度量(表、行等)将与sqlite限制不同。 - Ronak Poriya
2
@srv_sud 在下面的答案中有一个链接,似乎是上述信息的来源:https://www.sqlite.org/limits.html - Fotios Tsakiris
行数如何成为小数值? - Lakshay Parnami

13

我怀疑它大约有2 GB的大小(这可能是由于32位架构,尽管某些程序带有大文件支持,允许更多)。幸运的是,android.database.sqlite.SQLiteDatabase有以下API调用,可以返回数据库可能增长到的最大大小:

long getMaximumSize()

最终您可能想要研究数据库分片 ;)


2 GB 可能适用于在普通台式机上运行的数据库,但在 Android 移动设备上,我认为它是有限制的;我不知道限制是多少,但我经历过类似的问题,并猜测它大约在 4-6 MB 左右 - 不管数据库是在 sdcard 还是内部存储器上。 - Mathias Conradt
10
“getMaximumSize()”返回1 TB。 - TN.
我有一个疑问,如果在安卓中sqlite文件是外部的,那么限制会是什么?它和桌面端一样吗,还是仍然存在任何限制? - Vinay
@plaes,这个问题是在询问实际情况下的限制,而不是理论上的1 TB。 - Pacerier

4

SQLite有一些限制(http://www.sqlite.org/limits.html),这些限制可能会影响到任何数据库。您尝试过对此特定数据库进行vaccum;操作吗?它将重建结构。您可能遇到了某种程度的损坏,或者已经达到了其他编译限制,以确保数据库不会成为攻击向量。


1

我在这方面遇到了很多困难,因为有很多变数。这个演示的 Xamarin 应用程序允许您将自己的 JSON 对象示例重复地添加到 SQLite 数据库中,速度可以尽可能快,直到您停止它。让您查看数据库大小和应用程序性能的影响。它很粗糙,但很好地服务了我的目的,希望这能帮助其他人或您可以在此基础上进行扩展。您可以在 这里 找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接