想要在超出最大高速缓存大小时了解数据库行为

时间:2010-09-29 07:12:01

标签: android sqlite email-client

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

获得的错误日志如下:

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语句高速缓存达到MAX大小;即,缓存中此sql语句没有空格:SELECT _id FROM Attachment WHERE messageKey = 996。请更改您的sql语句以使用'?'对于bindargs,而不是使用实际值

我想知道出现上述错误的行为是什么。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

希望它有所帮助。