wake-up-neo.com

android Java.lang.IllegalStateException: Zeile 0, Spalte von CursorWindow konnte nicht gelesen werden

Ich entwickle eine Anwendung, die einige Dateien herunterlädt und ihren Text im Feld file_content in der Datenbank speichert. Die Dateigrößen können von einigen KB bis 10 MB variieren. Die App funktioniert beim Speichern für alle Größen. Das Problem tritt auf, wenn die select-Anweisung für lange file_content-Datensätze verwendet wird. Es gibt 

Java.lang.IllegalStateException: Zeile 0, Spalte 0 von CursorWindow konnte nicht gelesen werden

beim Abrufen solcher Zeilen. Gibt es Grenzen für die Feldinhaltgröße? Wenn ja, warum lässt es uns dann speichern und Fehler beim Abrufen von Fehlern? Hier ist mein Code, der diese Zeile abruft:

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));
    }

Irgendeine Idee, was los ist? Ich habe es auf 2 bis 3 Geräten getestet.

Logcat-Ausgabe:

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)
36
Khawar Raza

01-29 13: 41: 56.520: W/CursorWindow (4121): Fenster ist voll: angeforderte Zuordnung 5140987 Bytes, freier Speicherplatz 2096617 Bytes, Fenstergröße 2097152 Bytes

Android SQLite gibt Zeilen in Cursorfenstern zurück, die die maximale Größe von 2 MB haben, wie in config_cursorWindowSize angegeben. Wenn Ihre Zeile dieses Limit überschreitet, wird diese Fehlermeldung angezeigt.

Das Speichern großer Daten in der sqlite-Datenbank ist sowieso keine gute Idee. Speichern Sie Dateien im Dateisystem und Pfade in der Datenbank.

80
laalto

Wenn Sie Bilder als Bytes speichern möchten, setzen Sie die Qualität beim Komprimieren der Bitmap auf 0. 

0
alibabaei12