繁体   English   中英

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

[英]What is a maximum size of SQLite database on Android?

我有一个大小超过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卡上,有足够的空间。

字符串或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;vaccum; 这个特定的数据库? 它将重建结构。 您可能会有一定程度的损坏,或者您已经达到其中一个其他编译限制,以确保数据库不会成为漏洞利用向量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM