Impossible d'allouer CursorWindow
Je suis d'exploitation sur un SQLite3 base de données dans mon application android. Je viens de lire à partir de la pré base de données de population qui a 200k lignes et 14 colonnes. Les entrées sont des mots. Type de données de toutes les colonnes de texte. L'interrogation des mots de 11 lettres (par exemple. L'ABANDON) fonctionne très bien. Mais pour 12 ou plus (par exemple. ABANDONS), l'application se bloque. Voici le logcat:
Could not allocate CursorWindow '//data//data//com.example.myapp//databases//database.sqlite' of size 2097152 due to error -12.
threadid=11: thread exiting with uncaught exception (group=0x40adf9f0)
FATAL EXCEPTION: Thread-2883
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=861 (# cursors opened by this proc=861)
at android.database.CursorWindow.<init>(CursorWindow.java:104)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
at com.example.myapp.MainActivity.query(MainActivity.java:815)
at com.example.myapp.MainActivity$2.run(MainActivity.java:356)
at java.lang.Thread.run(Thread.java:856)
code:
query = "select * from words where col_1 = \"" + (myWord)+ "\";";
cursor = database.rawQuery(query, null);
if (cursor != null)
cursor.moveToFirst(); // line 815
if (!cursor.isAfterLast()) {
do {
for (i = 1; i < cursor.getColumnCount(); i++) {
temp = cursor.getString(i);
//other stuff
}
} while (cursor.moveToNext());
cursor.close();
}
Donc, quelle est l'erreur moyenne et pourquoi l'application de s'écraser?
source d'informationauteur Arjun U.
Vous devez vous connecter pour publier un commentaire.
Erreur -12 signifie curseur de fuite.
Svp essayez de le fermer comme suit:
J'ai été quering dans une boucle. Et la fermeture du curseur à l'intérieur de la boucle et non pas à l'extérieur résolu le problème.
Android curseurs de lire tous les résultats de la requête dans la mémoire, et ont une limite de 1 MO de données.
Cette limite a été choisie parce que cette quantité de données est susceptible de rendre votre application de fonctionner lentement sur un appareil mobile.
Vous devriez, si possible:
SELECT *
mais obtenir uniquement les colonnes dont vous avez besoin, et utiliser unWHERE
filtre);