2010-12-30 4 views
6

Мы создаем приложение, которое синхронизирует 5000 записей календаря с сервером. Проблема в том, что после добавления 1913 записей он не работает и дает следующую трассировку стека. В чем проблема?Android SQL Lite не растет

 
12-30 11:48:16.989: DEBUG/dalvikvm(384): GC_EXPLICIT freed 5699 objects/345848 bytes in 579ms 
12-30 11:48:22.530: DEBUG/dalvikvm(232): GC_EXPLICIT freed 2552 objects/124160 bytes in 311ms 
12-30 11:48:24.560: ERROR/CursorWindow(232): need to grow: mSize = 1048576, size = 414, freeSpace() = 328, numRows = 1913 
12-30 11:48:24.599: ERROR/CursorWindow(232): not growing since there are already 1913 row(s), max size 1048576 
12-30 11:48:24.599: ERROR/CursorWindow(232): The row failed, so back out the new row accounting from allocRowSlot 1912 
12-30 11:48:24.620: ERROR/Cursor(232): Failed allocating fieldDir at startPos 0 row 1912 
12-30 11:48:27.340: DEBUG/Cursor(232): finish_program_and_get_row_count row 3266 
12-30 11:48:28.070: ERROR/Calendar(Vikas)(384): Uncaught exception in EasSyncServicejava.lang.NullPointerException 
12-30 11:48:28.089: ERROR/Calendar(Vikas)(384): Sync ended due to an exception. 
+0

Посетите http://code.google.com/p/android/issues/detail?id=21435, возможно, вы выполняетесь по той же самой проблеме. –

ответ

6

CursorWindow класс поддерживает только чтение 1 МБ данных в запросе:

#define MAX_WINDOW_SIZE (1024 * 1024) 

(Source)

Попробуйте воспользоваться одним из следующих способов:

  • Запрос меньше строк.
  • Запросить меньшее количество столбцов.
  • Разделите свой запрос на более мелкие запросы и запустите их по одному.

Один из способов улучшить ситуацию - сохранить последнюю дату синхронизации на сервере и только синхронизировать изменения, произошедшие с этой даты.

SELECT * 
FROM calendar 
WHERE modified > 'some date' 
+0

Спасибо. По умолчанию приложение будет синхронизировать только те события, которые не синхронизируются, но мы должны поддерживать минимум 5000 календарных событий. вы можете поделиться своим кодом – user558022

+0

@ user558022 Вы можете добавить «LIMIT 500» к вашему запросу и только синхронизировать 500 событий. Затем, как только это будет сделано, запустите синхронизацию снова, чтобы получить следующие 500 и т. Д., Пока вы не синхронизируете все. –

+0

спасибо Mark, теперь то, что мы делаем, вызывает метод getCalendar, который возвращает одну строку каждый раз, когда она вызывается из jni. после каждого вызова мы закрываем курсор. но как у него заканчивается память. – user558022

1

У меня была такая же проблема, в моем случае было связано с NullPointerException путем анализа информации TimeZone (к сожалению трассировки стека теряется в коде).

Возможно, на вас повлияло эта проблема.

Посетите http://code.google.com/p/android/issues/detail?id=21435, я открыл проблему google, но похоже, что они не заинтересованы в проблеме. Проблема в настоящее время отменена.

Смежные вопросы