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

Posted

技术标签:

【中文标题】Android 上 SQLite 数据库的最大大小是多少?【英文标题】:What is a maximum size of SQLite database on Android? 【发布时间】:2011-03-29 19:10:46 【问题描述】:

我有一个大小超过 2.6 GiB 的 SQLite 数据库。 (数据库包含地图。) 该数据库由 RMaps 应用程序使用。当以最大缩放将地图移动到某些部分时,应用程序突然关闭。但是,没有强制关闭消息,没有报告按钮。所以,我有一个想法,它是由读取超出特定限制的块引起的,例如最大值(整数)。由于 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: Window45131410 com.robert.maps/com.robert.maps.MainMapActivity paused=false

SQLite db 存储在 SD 卡上,有足够的空间。

【问题讨论】:

尝试将数据库存储在 SD 卡上 【参考方案1】:

字符串或 BLOB 的最大长度默认大小为 1 GB 最大大小为 2.147483647

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

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

一个连接中的最大表数默认为 64 个表

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

一个表最大行数最大为 18446744073.709552765

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

【讨论】:

如果应用达到此限制会怎样? 这是一个很好的信息。您能告诉我们这些信息的来源吗? @Pravin,问题是要求在实践中的限制,而不是理论上的限制。 指定的限制适用于 sqlite,由于设备存储与提到的限制不同,最大指标(表、行等)在 ormlite 的情况下将与 sqlite 限制不同 @srv_sud 在下面的答案中有一个链接,这似乎是上述信息的来源:sqlite.org/limits.html【参考方案2】:

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

long getMaximumSize()

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

【讨论】:

2 GB 可能是在普通台式机上运行的数据库的情况,但在 Android 移动设备上我认为它是有限的;我不知道限制,但我遇到过类似的问题,并且猜测它大约是 4-6 MB - 无论数据库是在 sdcard 还是内部存储上。 getMaximumSize() 返回 1 TB。 我怀疑如果sqlite文件在android中是外部的,那么限制是什么?和桌面一样还是有限制 @plaes,问题是要求在实践中的限制,而不是理论上的 1 TB。【参考方案3】:

SQlite 有几个限制 (http://www.sqlite.org/limits.html) 可以与任何数据库一起使用。您是否尝试过vaccum;ing 这个特定的数据库?它将重建结构。您可能存在某种程度的损坏,或者您已经达到了确保数据库不会成为漏洞利用向量的其他编译限制之一。

【讨论】:

【参考方案4】:

我很难获得这方面的可靠信息,但变量太多。此演示 Xamarin 应用程序允许您将您自己的 JSON 对象的示例以您想要的速度重复添加到 SQLite 数据库,直到您停止它。允许您查看对数据库大小和应用程序性能的影响。它很粗糙,但很好地满足了我的目的,希望这可以帮助其他人,或者您可以扩展它。你可以找到它here。

【讨论】:

以上是关于Android 上 SQLite 数据库的最大大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

转载Android数据存储之SQLite

SQLite 中的各种限制

Android 在保存到 SQLITE 时更改像素或图像大小

Android SQLite使用

Android排序sqlite查询结果忽略大小写

Litedb 数据库的最大大小是多少以及如何声明未使用的空间?