【问题标题】:Want to know database behavior when Maximum cache size is exceeded想知道超过最大缓存大小时的数据库行为
【发布时间】:2012-11-30 21:07:11
【问题描述】:

在大量使用电子邮件数据库后(有超过 1000 封邮件),电子邮件应用程序崩溃。如果我再次回到应用程序,所有邮件都开始自动删除。

得到的错误日志如下:

E/AndroidRuntime(  417): java.lang.OutOfMemoryError
E/AndroidRuntime(  417):    at java.lang.String.<init>(String.java:468)
E/AndroidRuntime(  417):    at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:659)
E/AndroidRuntime(  417):    at java.lang.StringBuilder.toString(StringBuilder.java:664)
E/AndroidRuntime(  417):    at com.android.email.mail.transport.DiscourseLogger.addReceivingLineToBuffer(DiscourseLogger.java:57)
E/AndroidRuntime(  417):    at com.android.email.mail.transport.DiscourseLogger.addReceivedByte(DiscourseLogger.java:70)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readByte(ImapResponseParser.java:71)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.expect(ImapResponseParser.java:332)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.parseToken(ImapResponseParser.java:199)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readToken(ImapResponseParser.java:165)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readTokens(ImapResponseParser.java:141)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapResponseParser.readResponse(ImapResponseParser.java:92)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapStore$ImapConnection.readResponse(ImapStore.java:1491)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapStore$ImapFolder.fetchInternal(ImapStore.java:887)
E/AndroidRuntime(  417):    at com.android.email.mail.store.ImapStore$ImapFolder.fetch(ImapStore.java:810)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.synchronizeMailboxGeneric(MessagingController.java:898)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.synchronizeMailboxSynchronous(MessagingController.java:396)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.access$2(MessagingController.java:384)
E/AndroidRuntime(  417):    at com.android.email.MessagingController$2.run(MessagingController.java:372)
E/AndroidRuntime(  417):    at com.android.email.MessagingController.run(MessagingController.java:171)
E/AndroidRuntime(  417):    at java.lang.Thread.run(Thread.java:1096)

W/Database(497): 数据库 /data/data/com.android.email/databases/EmailProvider.db 的已编译 sql 语句缓存达到最大大小;即,缓存中没有此 sql 语句的空间:SELECT _id FROM Attachment WHERE messageKey=996。请更改您的 sql 语句以使用“?”对于 bindargs,而不是使用实际值

我想知道我收到上述错误的行为是什么。

我的意思是如果超过最大缓存大小,android 会做什么?如果你能说出它的实现是在哪里完成的,那将非常有帮助。

【问题讨论】:

    标签: android sqlite email-client


    【解决方案1】:

    这是另一个问题。这条消息说明了一切: "数据库的已编译 sql 语句缓存达到 MAX 大小"

    基本上,电子邮件应用程序在查询中使用硬编码值。相反,它应该使用准备好的语句以便只缓存准备好的语句。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      您可以使用setMaximumSize 设置最大数据库大小。

      您可以使用getMaximumSiz 让线程检查数据库大小,如果这接近您之前修复的数据库大小。

      然后将本地数据库复制(复制)到 SD 卡上的数据库,并使用 releaseMemory 释放内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 2014-10-07
        • 1970-01-01
        • 2017-10-19
        • 2018-02-27
        • 2011-02-25
        相关资源
        最近更新 更多