Хотите знать поведение базы данных при превышении максимального размера кэша - PullRequest
1 голос
/ 29 сентября 2010

После интенсивного использования базы данных электронной почты (было более 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 / База данных (497): достигнут максимальный размер длякэш скомпилированных SQL-операторов для базы данных /data/data/com.android.email/databases/EmailProvider.db;то есть, нет места для этого оператора SQL в кэше: SELECT _id FROM Attachment WHERE messageKey = 996.Пожалуйста, измените ваши SQL-операторы, чтобы использовать '?'для bindargs, вместо использования фактических значений

Я хочу знать, каково поведение, которое я получаю вышеупомянутую ошибку.

Я имею в виду, что будет делать Android, если максимальный размер кэша равенпревышена?Если бы вы могли сказать, где осуществляется реализация, это будет очень полезно.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

это другая проблема.Это сообщение говорит само за себя: «Достигнут максимальный размер для кеша скомпилированных SQL-команд для базы данных»

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

Надеюсь, это поможет.

0 голосов
/ 28 января 2011

У вас есть возможность установить максимальный размер БД с помощью setMaximumSize.

У вас может быть поток, проверяющий размер БД с помощью getMaximumSiz, и если он близок к размеру БД, который вы исправили ранее.

Затем скопируйте (скопируйте) свою локальную БД в БД на SD-карте и освободите память с помощью releaseMemory.

...