2010-12-30 8 views
6

Stiamo creando un'app che sincronizza 5000 voci del calendario con il server. Il problema è che dopo aver aggiunto 1913 voci fallisce e dando la seguente traccia dello stack. Qual è il problema?Android SQL Lite non riesce a crescere

 
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

Visita http://code.google.com/p/android/issues/detail?id=21435, forse si sono effettuate dallo stesso problema –

risposta

6

La classe CursorWindow supporta solo la lettura di 1 MB di dati per query:

#define MAX_WINDOW_SIZE (1024 * 1024) 

(Source)

provare una o più delle seguenti operazioni:

  • Richiesta meno righe.
  • Richiedi un numero inferiore di colonne.
  • Suddividi la query in query più piccole ed eseguine una alla volta.

Un modo per migliorare la situazione è memorizzare l'ultima data di sincronizzazione sul server e sincronizzare solo le modifiche verificatesi da quella data.

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

ThanksBy di default l'applicazione si sincronizza solo gli eventi quelli che non vengono sincronizzate, ma abbiamo Dare supporto per un minimo di 5000 eventi del calendario. puoi condividere qualche codice – user558022

+0

@ user558022 Puoi aggiungere "LIMIT 500" alla tua query e sincronizzare solo 500 eventi. Quindi, una volta fatto, esegui nuovamente la sincronizzazione per ottenere i successivi 500 ecc. Finché non hai sincronizzato tutto. –

+0

grazie Mark, ora quello che stiamo facendo è chiamare un metodo getCalendar che restituisce una riga ogni volta che viene chiamata forma il jni. dopo ogni chiamata stiamo chiudendo il cursore. ma come sta finendo la memoria. – user558022

1

Ho avuto lo stesso problema, nel mio caso è stato a causa di un NullPointerException analizzando informazioni TimeZone (purtroppo l'analisi dello stack si perde in codice).

Forse si è interessati dallo stesso problema.

Visita http://code.google.com/p/android/issues/detail?id=21435, ho aperto un problema da Google ma sembra che non siano interessati al problema. Il problema è attualmente rifiutato.

Problemi correlati