我收到此错误:Android 2.2上的数据超过UNCOMPRESS_DATA_MAX但2.3上没有

时间:2011-04-26 10:46:24

标签: android

我只在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”所以我该如何解决这个问题?

我将不胜感激,

谢谢!!!

5 个答案:

答案 0 :(得分:28)

我也有类似的问题,经过多次搜索,我找到了这个页面来回答我的问题。

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

总之,Android会压缩除页面上列出的资源文件之外的任何资产文件,因为它们已经过压缩。这种压缩通常是一件好事,但是当文件太大时,它会回到程序员身上。作者建议的两个选项是1)将数据库文件重命名为未压缩的文件(如.jpg)或2)关闭数据库文件扩展名的压缩(请参阅博客文章,了解如何操作)那)。如果使用Eclipse,那么数字2可能很难,因此作者建议使用第一个选项。

这整个问题在Android 2.3.3中已得到纠正,这就是为什么你没有出现错误的原因:)

编辑:这个网站真的很简单地解释了: https://web.archive.org/web/20120423232710/http://www.nutprof.com/2010/12/data-exceeds-uncompressdatamax.html

编辑2:回顾这个答案,我意识到根据文件的大小,您可以考虑从Web服务器下载文件,然后将其复制到您需要的任何地方。在我的情况下,我正在将SQLLite数据库复制到应用程序私有存储,但由于APK已签名,我无法从我的资产中删除旧数据库。所以现在不是所有那些时髦的命名内容,我只是在第一次运行时从互联网上下载并将其放入私人空间。这样,应用程序在首次运行时不会使其大小加倍。

答案 1 :(得分:2)

我做了Bob上面提到的。它对我很有用。 我无法在早于2.3.3的版本上运行应用程序,但是当我将.html文件(由于Web SQL命令而为4MB)重命名为.jet时(或者就像{{{{ 3}}),它在2.1 update1和2.2上运行良好。

问题是2.3.3之前的Android版本试图在/ assets /文件夹中压缩大小超过1MB的所有文件。因此,我将其重命名为已经压缩的扩展,以便Android不会再尝试压缩它。虽然我不知道Android编程,但我认为这是在阅读上述内容以及其他一些在线链接之后发生的事情。

答案 2 :(得分:1)

我找到了Froyo(2.2)的解决方法,但APK从4.x megs到10.x megs。 简单:重新压缩apk文件,压缩0。 我是在Windows上做到的: 1.-将apk文件重命名为zip, 2.将其解压缩到某个文件夹, 3.使用“store”选项再次压缩它(我真的使用WinRAR,所以“存储”意味着根本没有压缩), 4.然后将其从zip重命名为apk, 5.-并安装它。

答案 3 :(得分:0)

只需将.db扩展名更改为.png即可在2.2及以上设备中使用

答案 4 :(得分:0)

您可以拆分文件并将拆分文件放在assets文件夹中。
例如largfile.db到db1.db,db2.db,db3.db
然后编写代码将这些文件组合回设备上的largefile.db。