2010-08-14 4 views
24

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

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

(я имею Froyo на Nexus One, но я не думаю, что это только проблема Froyo.) Выход

Log:

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-карте, достаточно места.

+0

Попробуйте сохранить db на SD-карте – Falmarri

+0

Он находится на SD-карте. –

+0

fat32 предел в sdcard? –

ответ

10

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

long getMaximumSize() 

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

+0

2 GB может иметь место для db, работающего на обычной настольной машине, но на мобильном устройстве Android я думаю, что он ограничен; Я не знаю предела, но у меня возникли аналогичные проблемы, и я думаю, что это примерно 4-6 МБ - независимо от того, находится ли db на SD-карте или внутреннем хранилище. –

+7

'getMaximumSize()' возвращает 1 ТБ. –

+0

У меня есть сомнение, что если файл sqlite является внешним в android, то какой будет предел? Это то же самое, что и на рабочем столе или все еще есть какие-либо ограничения – Vinay

3

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

9

Максимальная длина строки или BLOB По умолчанию размер составляет 1 ГБ Максимальный размер 2,147483647

Максимальное количество колонок по умолчанию размер составляет 2000 Максимальный размер 32767

Максимальная длина SQL Statement По умолчанию размера 1 MB Максимальный размер составляет 1.073741824

Максимальное количество таблиц в Join По умолчанию 64 таблицы

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

Максимальное количество строк в таблице Макс размер 18446744073,709552765

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

+0

Что произойдет, если приложение достигнет этих ограничений? – max

+5

Его хорошая информация. Не могли бы вы рассказать нам источник этой информации? –

+1

@srv_sud http://www.sqlite.org/limits.html – Saj

1

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

Смежные вопросы