android java.lang.IllegalStateException: impossible de lire la ligne 0, col-0 à partir de CursorWindow
Je développe une application qui télécharger des fichiers et de les enregistrer leur texte dans file_content champ de base de données. La taille des fichiers peut varier de quelques ko /s à 10 MB. L'application fonctionne pour toutes les tailles alors que d'économie. Le problème se produit lors de l'utilisation de l'instruction select sur le long file_content enregistrements. Il donne
java.lang.IllegalStateException: impossible de lire la ligne 0, col-0 à partir de CursorWindow
lors de l'extraction de ces lignes. Existe-il des limites sur le terrain de la taille du contenu? Si oui, alors pourquoi il nous permet d'enregistrer et de donner d'erreur lors de la récupération?
Voici mon code ciselée qui récupère 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.
Logcat de sortie:
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)
- J'ai signalé ce billet pour Google, c'est un mauvais API qui permet aux développeurs d'obtenir dans cette situation. Des étoiles et des commentaires sur cette question à l'attention de Google à l'adresse: issuetracker.google.com/issues/145977220
Vous devez vous connecter pour publier un commentaire.
Android SQLite renvoie les lignes du curseur de windows qui ont la taille maximale de 2 mo, comme spécifié par
config_cursorWindowSize
. Si votre ligne dépasse cette limite, vous obtiendrez cette erreur.Le stockage de données de grande taille dans la base de données sqlite n'est pas une bonne idée de toute façon. Stocker des fichiers dans le système de fichiers et les chemins d'accès dans la base de données.
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
sur le champ de l'image et l'enregistrer comme un objet ByteArrayDans le cas où vous souhaitez enregistrer les images comme des octets, une Autre façon de le faire est, lors de la compression de l'image bitmap, de définir la qualité à 0.