Il cursore Android SQLite carica tutti i record nella memory contemporaneamente?

Un cursore di Android SQLite carica tutti i dati per una query nella memory o c'è qualche tipo di strategia di ottimizzazione che fa parte della sua implementazione?

  • android.app.Application non può essere lanciato in android.app.Activity
  • Android Pro e contro: Event Bus e RxJava
  • Android WebView non carica contenuto misto
  • Tipo di errore di acquisto di restituzione di Google IAB = 3 subtype = 4
  • Imansible trovare actionbarsherlock.apk
  • Errore di Android "Not_Market_Managed"
  • ButterKnife 8.0.1 non funziona
  • Scarica l'image da una nuova applicazione Google+ (più)
  • Rilevamento visivo in Android?
  • Il layout dei bambini ripete molte volte in ExpandableListView
  • Frammenti che non funzionano correttamente dopo il cambio di orientamento
  • Android - Fragment API per il livello API <11
  • 3 Solutions collect form web for “Il cursore Android SQLite carica tutti i record nella memory contemporaneamente?”

    Un SQLiteCursor riempie una "window" con i dati durante la navigazione. Il mio ricordo è che la dimensione della window è di 1MB, ma non posso indicare a un codice specifico che support quel ricordo. Quindi, per le piccole query, l'effetto netto è che SQLiteCursor manterrà l'integer set di risultati in memory, una volta che si avvia l'accesso alle righe e alle colonne.

    Grazie per CommonsWare circa Termine di Window così ho invertito di nuovo Android navigando quelle classi SQLiteCursor -> AbstractWindowedCursor -> CursorWindow . Ecco il constructor di CursorWindow :

      public CursorWindow(String name) { mStartPos = 0; mName = name != null && name.length() != 0 ? name : "<unnamed>"; if (sCursorWindowSize < 0) { /** The cursor window size. resource xml file specifies the value in kB. * convert it to bytes here by multiplying with 1024. */ sCursorWindowSize = Resources.getSystem().getInteger( com.android.internal.R.integer.config_cursorWindowSize) * 1024; } mWindowPtr = nativeCreate(mName, sCursorWindowSize); if (mWindowPtr == 0) { throw new CursorWindowAllocationException("Cursor window allocation of " + (sCursorWindowSize / 1024) + " kb failed. " + printStats()); } mCloseGuard.open("close"); recordNewWindow(Binder.getCallingPid(), mWindowPtr); } 

    Come potete vedere, sCursorWindowSize è la dimensione che CommonsWare ha menzionato:

     sCursorWindowSize = Resources.getSystem().getInteger( com.android.internal.R.integer.config_cursorWindowSize) * 1024; 

    Poiché la mia versione corrente è Android SDK 23.0.1 , il valore di com.android.internal.R.integer.config_cursorWindowSize è 2048. Significa 2MB. Non ho un'altra versione SDK per il controllo.

    Il cursore non contiene tutti i risultati in memory, ma ha il count totale della query restituita (via getCount). Mentre si esegue l'iterazione sui risultati che recupera le voci (non uno a uno immagino ma probabilmente in blocchi). Sono abbastanza sicuro che ci siano ottimizzazioni su questo livello. Una volta terminata, dovrai chiuderla – altrimenti perché il sistema continuerà ad aprire dopo che la query è già stata fatta.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.