Я получаю эту ошибку: данные превышают UNCOMPRESS_DATA_MAX на Android 2.2, но не на 2.3

Я получаю сообщение об ошибке только на версию Android 2.2, но не на 2.3.

Ошибка:

 04-26 13:41:34.862: ERROR/Database(3701):  sqlite3_open_v2("/data/data/com.TravelPharm/databases/medicaments.sqlite", &handle, 1, NULL) failed
 04-26 13:41:34.942: DEBUG/dalvikvm(417): GC_EXPLICIT freed 82 objects / 4000 bytes in 1617ms
 04-26 13:41:35.062: DEBUG/asset(3701): Data exceeds UNCOMPRESS_DATA_MAX (17304576 vs 1048576)
 04-26 13:41:35.062: DEBUG/AndroidRuntime(3701): Shutting down VM
 04-26 13:41:35.072: WARN/dalvikvm(3701): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701): FATAL EXCEPTION: main
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701): java.lang.Error: Error copying database
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at com.TravelPharm.DBHelper.createDataBase(DBHelper.java:395)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at com.TravelPharm.TravelPharm.SumofDetails(TravelPharm.java:290)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at com.TravelPharm.TravelPharm.onCreate(TravelPharm.java:64)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.os.Handler.dispatchMessage(Handler.java:99)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.os.Looper.loop(Looper.java:123)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at android.app.ActivityThread.main(ActivityThread.java:4627)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at java.lang.reflect.Method.invokeNative(Native Method)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at java.lang.reflect.Method.invoke(Method.java:521)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 04-26 13:41:35.103: ERROR/AndroidRuntime(3701):     at dalvik.system.NativeStart.main(Native Method)

Я понимаю, что это потому, что моя база данных слишком большая "UNCOMPRESS_DATA_MAX", так как я могу решить проблему?

Буду признателен за любую помощь,

Спасибо!!!

Ответ 1

У меня тоже есть аналогичная проблема, и после долгих поисков я нашел эту страницу, чтобы ответить на мой вопрос.

http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/

Таким образом, Android сжимает любой файл активов, кроме тех, которые перечислены на странице, поскольку они уже сжаты. Это сжатие, как правило, хорошо, но оно возвращается к преследованию программистов, когда файл слишком велик. Два варианта, которые автор предлагает: 1) переименовать файл базы данных, чтобы он не был сжат (например .jpg), или 2) отключить сжатие для расширения файла базы данных (см. Сообщение в блоге о том, как это сделать что). Номер 2 может быть затруднен, если вы используете Eclipse, поэтому автор рекомендует использовать первый вариант.

Вся эта проблема была исправлена ​​в Android 2.3.3, поэтому у вас нет ошибки:)

EDIT: этот сайт объясняет это просто: https://web.archive.org/web/20120423232710/http://www.nutprof.com/2010/12/data-exceeds-uncompressdatamax.html

EDIT 2: Оглядываясь назад на этот ответ, я понимаю, что в зависимости от размера вашего файла, возможно, вы можете рассмотреть возможность загрузки файла с веб-сервера, а затем скопировать его туда, куда вам нужно. В моем случае я копировал SQLLite DB в частное хранилище приложений, но, так как APK подписан, я не мог избавиться от старой базы данных из своих советов. Так что теперь вместо всего этого напуганного именования, я просто пошел и загрузил его из Интернета в первый раз и поместил его в личное пространство. Таким образом, приложение не удваивает свой размер при первом запуске.

Ответ 2

Я сделал то, о чем упомянул Боб. Это отлично поработало для меня. Мне не удалось запустить приложение на версиях старше 2.3.3, но когда я переименовал мой .html файл (который был 4 МБ из-за команд веб-SQL) в .jet(или, если на то пошло, любое уже сжатое расширение, упомянутое в введите описание ссылки здесь), он отлично работал и с версиями 2.1 update1 и 2.2.

Проблема заключалась в том, что версии для Android старше 2.3.3 пытались сжать все файлы размером более 1 МБ в папке /assets/. Итак, я переименовал его в уже сжатое расширение, чтобы Android не пытался сжимать его снова. Хотя я не знаю о программировании на Android, я думаю, что это то, что происходит после прочтения выше и нескольких других ссылок в Интернете.

Ответ 3

Я нашел обходное решение для Froyo (2.2), но APK получил от 4.x megs long до 10.x megs. Сделайте это простым: rezip файл apk со сжатием 0. Я сделал это в Windows: 1.-Переименуйте файл apk в zip, 2.-разархивируйте его в какую-то папку, 3.-zip снова с опцией "store" (я действительно использую WinRAR, поэтому "store" означает отсутствие сжатия вообще), 4. затем переименуйте его обратно из zip в apk, 5. и установите его.

Ответ 4

Просто сменив расширение .db на .png, он будет работать в версиях 2.2 и выше

Ответ 5

Вы можете разбить файл и поместить разделенные файлы в папку с ресурсами.
Например, файл largefile.db для db1.db, db2.db, db3.db
А затем напишите код, чтобы объединить эти файлы с файлом largefile.db на устройстве.