Ограничение размера курсора в Android SQLiteDatabase - PullRequest
18 голосов
/ 23 марта 2011

Я загружаю БД из интернета. Я сохраняю его в папке с данными и открываю. Внутри БД находится таблица «Объявления» с 6 полями. 2 из этих полей - BLOB. Когда я хочу прочитать из этой таблицы ... У меня есть некоторая проблема ... Я заметил, что когда я читаю строку с полем BLOB-объекта больше 1 мегабайта, это вызывает исключение ... "получить слот поля из строки 0 col 0 не удалось ". если это маленький шарик, то все в порядке ... заранее спасибо :)

Ответы [ 5 ]

50 голосов
/ 12 мая 2011

Существует ограничение в 1 МБ для внутренних активов из-за динамической декомпрессии;ограничение в 1 МБ также применяется к BLOB-объектам Cursor, но это нигде не документировано.

Как правило, в SQLite следует избегать больших двоичных объектов, поскольку они плохо работают;вместо этого сохраните данные большого двоичного объекта как файл и сохраните местоположение файла в вашей БД.

11 голосов
/ 03 октября 2012

Чтение BLOB размером менее 100 КБ из базы данных SQLite происходит быстрее, чем чтение из файловой системы. Тем не менее, все, что больше, чем это лучше всего хранить на диске, со ссылкой в ​​БД. Больше на: http://www.sqlite.org/intern-v-extern-blob.html

10 голосов
/ 06 сентября 2012

Существует ограничение в 1 МБ на операцию.(Я не уверен, если это для строки или столбца в случае запросов SQLite).Ограничение связано с тем, что API SQLite взаимодействует с sqlite вне процесса через систему Binder / Parcel IPC.То же ограничение применяется к значениям в Bundle (например, Intent extras).

Буфер транзакций Binder имеет ограниченный фиксированный размер, в настоящее время 1 МБ, который используется всеми выполняющимися транзакциями для процесса.

См .: http://developer.android.com/reference/android/os/TransactionTooLargeException.html

1 голос
/ 19 мая 2011

Похоже, поддержка BLOB в Android еще не реализована ...

http://www.basic4ppc.com/forum/basic4android-updates-questions/6648-support-sqlite-blob.html

Какие данные хранятся в полях BLOB?Я бы предположил картинки.

Я бы порекомендовал НЕ использовать BLOB.Файловая система - гораздо лучший выбор для двоичных данных.

Не могли бы вы немного подробнее рассказать о том, чего вы хотите достичь с помощью базы данных?

1 голос
/ 18 мая 2011

Является ли используемый вами запрос "выбором" указанного большого двоичного объекта? Вы можете опустить это? Если вы не можете, используете ли вы:

 blob = rs.getBlob(column) ;
 InputStream in = blob.getBinaryStream();

или

 blob.getBytes(1, lengthOblob) ;

Первый метод позволит вам читать большие двоичные объекты. Второй будет загружать BLOB-объект сразу.

...