Je développe une application qui télécharge des fichiers et enregistre leur texte dans le champ file_content dans la base de données. La taille des fichiers peut varier de quelques Ko à 10 Mo. L'application fonctionne pour toutes les tailles tout en enregistrant. Le problème se produit lors de l'utilisation de l'instruction select sur les enregistrements long file_content. Il donne
Java.lang.IllegalStateException: impossible de lire la ligne 0, la colonne 0 de CursorWindow
lors de la récupération de ces lignes. Y a-t-il des limites à la taille du contenu du champ? Si tel est le cas, pourquoi nous laisser enregistrer et générer des erreurs lors de la récupération? Voici mon code extrait de la ligne:
public String getFileContent(MyFile gc) {
if(!isDBOpen()) {
open();
}
try {
String mQuery = "SELECT * FROM " + DBOpenHelper.TABLE_SAVED_FILES + " WHERE " + DBOpenHelper.COLUMN_ID + " = " + gc.id;
Cursor mCursor = database.rawQuery(mQuery, null);
if(mCursor.getCount() <= 0) {
return null;
}
if(mCursor.moveToFirst()) {
return getCursorRowContent(mCursor);
}
} catch (Exception e) {
e.getMessage();
}
return null;
}
private String getCursorRowContent(Cursor mCursor) throws Exception {
return mCursor.getString(mCursor.getColumnIndex(DBOpenHelper.COLUMN_FILE_CONTENT));
}
Une idée de ce qui se passe? Je l'ai testé sur 2 à 3 appareils.
Sortie Logcat:
01-29 13:41:56.520: W/CursorWindow(4121): Window is full: requested allocation 5140987 bytes, free space 2096617 bytes, window size 2097152 bytes
01-29 13:41:56.520: E/CursorWindow(4121): Failed to read row 0, column 0 from a CursorWindow which has 0 rows, 9 columns.
01-29 13:43:30.932: W/System.err(4121): Java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
01-29 13:43:30.932: W/System.err(4121): at Android.database.CursorWindow.nativeGetLong(Native Method)
01-29 13:43:30.932: W/System.err(4121): at Android.database.CursorWindow.getLong(CursorWindow.Java:507)
01-29 13:43:30.932: W/System.err(4121): at Android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.Java:75)
01-29 13:43:30.936: W/System.err(4121): at Android.database.AbstractCursor.moveToPosition(AbstractCursor.Java:220)
01-29 13:43:30.936: W/System.err(4121): at Android.database.AbstractCursor.moveToNext(AbstractCursor.Java:245)
01-29 13:43:30.940: W/System.err(4121): at com.nxb.cachehead.bl.PocketQueryDataSource.getGeoCacheContent(PocketQueryDataSource.Java:97) 01-29 13:43:30.940: W/System.err(4121): at com.nxb.cachehead.bl.GPXFileCopyAsyncTask.doInBackground(GPXFileCopyAsyncTask.Java:27)
01-29 13:43:30.940: W/System.err(4121): at com.nxb.cachehead.bl.GPXFileCopyAsyncTask.doInBackground(GPXFileCopyAsyncTask.Java:1)
01-29 13:43:30.940: W/System.err(4121): at Android.os.AsyncTask$2.call(AsyncTask.Java:287)
01-29 13:43:30.944: W/System.err(4121): at Java.util.concurrent.FutureTask.run(FutureTask.Java:234)
01-29 13:43:30.944: W/System.err(4121): at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:230)
01-29 13:43:30.948: W/System.err(4121): at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1080)
01-29 13:43:30.948: W/System.err(4121): at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:573)
01-29 13:43:30.948: W/System.err(4121): at Java.lang.Thread.run(Thread.Java:856)
01-29 13: 41: 56.520: W/CursorWindow (4121): La fenêtre est pleine: allocation demandée 5140987 octets, espace disponible 2096617 octets, taille de la fenêtre 2097152 octets
Android SQLite renvoie les lignes dans les fenêtres de curseur dont la taille maximale est de 2 Mo, comme indiqué par config_cursorWindowSize
. Si votre ligne dépasse cette limite, vous obtiendrez cette erreur.
Stocker des données volumineuses dans une base de données sqlite n'est de toute façon pas une bonne idée. Stocker les fichiers dans le système de fichiers et les chemins dans la base de données.
Si vous souhaitez enregistrer des images sous forme d'octets, définissez la qualité sur 0 lors de la compression du bitmap.