Каков максимальный размер базы данных SQLite на Android?

У меня есть база данных SQLite размером более 2,6 ГБ. (База данных содержит карты.) Эта база данных используется приложением RMaps. При перемещении карт в некоторые части с максимальным увеличением приложение внезапно закрывается. Однако нет ни сообщения о принудительном закрытии, ни кнопки отчета. Итак, у меня есть идея, что это вызвано блоками чтения, которые выходят за определенный предел, например. макс (целое число). Поскольку RMaps просто использует простые операторы SQL, я думаю, что проблема не в RMaps, а в драйвере Android SQLite.

Есть ли ограничение на размер базы данных SQLite на Android?

(У меня Froyo на Nexus One, но я не думаю, что это проблема только 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-карте, места достаточно.


person TN.    schedule 14.08.2010    source источник
comment
Попробуйте сохранить БД на SD-карте   -  person Falmarri    schedule 15.08.2010


Ответы (4)


Максимальная длина строки или большого двоичного объекта. Размер по умолчанию — 1 ГБ. Максимальный размер — 2,147483647.

Максимальное количество столбцов. Размер по умолчанию — 2000. Максимальный размер — 32 767.

Максимальная длина оператора SQL Размер по умолчанию — 1 МБ Максимальный размер — 1,073741824

Максимальное количество таблиц в соединении по умолчанию — 64 таблицы.

Максимальное количество подключенных баз данных. По умолчанию — 10. Максимальный размер — 125.

Максимальное количество строк в таблице Максимальный размер 18446744073.709552765

Максимальный размер базы данных 140 ТБ, но это зависит от размера диска вашего устройства.

person Pravin Bhosale    schedule 16.02.2015
comment
что произойдет, если приложение достигнет этих пределов? - person max; 09.12.2015
comment
Это хорошая информация. Не могли бы вы указать нам источник этой информации? - person srv_sud; 15.06.2016
comment
@Pravin, вопрос заключается в ограничении на практике, а не в теоретическом пределе. - person Pacerier; 30.01.2017
comment
Указанный предел применим для sqlite, поскольку хранилище устройства отличается от указанного предела, максимальная метрика (таблицы, строки и т. д.) будет отличаться от предела sqlite в случае ormlite. - person Ronak Poriya; 23.03.2017
comment
@srv_sud В ответе ниже есть ссылка, которая, по-видимому, является источником приведенной выше информации: sqlite. org/limits.html - person Fotis Tsakiris; 25.01.2021

Я подозреваю, что это ~ 2 гигабайта (это может быть связано с 32-битной архитектурой, хотя некоторые программы поставляются с поддержкой больших файлов, что позволяет больше). К счастью, android.database.sqlite.SQLiteDatabase имеет следующий вызов API, который возвращает максимальный размер, до которого может вырасти база данных:

long getMaximumSize()

В конце концов, вы можете захотеть изучить сегментирование базы данных;)

person plaes    schedule 22.08.2010
comment
2 ГБ может быть для базы данных, работающей на обычном настольном компьютере, но на мобильном устройстве Android я думаю, что это ограничено; Я не знаю предела, но у меня были похожие проблемы, и я предполагаю, что это около 4-6 МБ - независимо от того, находится ли БД на SD-карте или во внутренней памяти. - person Mathias Conradt; 22.08.2010
comment
getMaximumSize() возвращает 1 ТБ. - person TN.; 24.08.2010
comment
У меня есть сомнения, что если файл sqlite является внешним в Android, то какой будет предел? Это то же самое, что и настольный компьютер, или все же есть какие-либо ограничения? - person Vinay; 20.08.2013
comment
@plaes, вопрос заключается в ограничении на практике, а не в теоретическом 1 ТБ. - person Pacerier; 30.01.2017

SQlite имеет несколько ограничений (http://www.sqlite.org/limits.html), которые могут вступают в игру с любой базой данных. Вы пробовали vaccum; работать с этой конкретной базой данных? Он восстановит структуры. У вас может быть некоторый уровень коррупции, или вы достигли одного из других скомпилированных ограничений, которые существуют, чтобы гарантировать, что БД не станет вектором эксплойта.

person Kitson    schedule 13.05.2011

Я изо всех сил пытался получить достоверную информацию об этом, но есть так много переменных. Это демонстрационное приложение Xamarin позволяет многократно добавлять пример собственного объекта JSON в базу данных SQLite с любой скоростью, пока вы не остановите его. Позволяет вам просматривать влияние как на размер базы данных, так и на производительность приложения. Это грубо, но хорошо служит моим целям, и, надеюсь, это может помочь кому-то еще, или вы можете расширить его. Вы можете найти его здесь.

person Post Impatica    schedule 31.07.2017