android java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行,第 0 列

新手上路,请多包涵

我正在开发一个应用程序,它下载一些文件并将它们在 file_content 字段中的文本保存到数据库中。文件大小从几 KB 到 10 MB 不等。该应用程序在保存时适用于所有尺寸。在长 file_content 记录上使用 select 语句时会出现问题。它给

java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行,第 0 列

获取此类行时。字段内容大小有限制吗?如果是这样,那么为什么它让我们在检索时保存并给出错误?这是我截断的获取行的代码:

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

知道发生了什么事吗?我已经在 2 到 3 台设备上对其进行了测试。

日志输出:

 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)

原文由 Khawar Raza 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

01-29 13:41:56.520: W/CursorWindow(4121): 窗口已满:请求分配 5140987 字节,可用空间 2096617 字节,窗口大小 2097152 字节

Android SQLite 返回游标窗口中最大大小为 2MB 的行,如 config_cursorWindowSize 所指定。如果您的行超过此限制,您将收到此错误。

无论如何,将大数据存储在 sqlite 数据库中并不是一个好主意。将文件存储在文件系统中,将路径存储在数据库中。

原文由 laalto 发布,翻译遵循 CC BY-SA 4.0 许可协议

在使用 React Native 的情况下,它适用于我:

MainApplication.javaonCreate() 末尾添加这段代码

try {
  Field field = CursorWindow.class.getDeclaredField("sCursorWindowSize");
  field.setAccessible(true);
  field.set(null, 100 * 1024 * 1024); //100MB
  } catch (Exception e) {
 if (BuildConfig.DEBUG) {
  e.printStackTrace();
  }
  }

还要在 MainApplication.java 之上导入这些

import android.database.CursorWindow;
import java.lang.reflect.Field;

原文由 Shehzad Osama 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题