RoomDatabase - 由于错误 -24,无法分配大小为 2097152 的 CursorWindow

JDe*_*evs 5 android android-database android-room

我正在开发一个 Android 应用程序,使用 Room Database链接在本地保存数据。\n在简单的查询中,它工作正常。但是,当我循环遍历数据列表以在本地保存时,我得到 CursorWindowAllocationException。\n通过谷歌搜索,我应该像“cursor.close()”一样关闭光标,但是如何处理房间数据库中的光标?

\n\n

谢谢你!

\n\n

错误 :

\n\n
Could not allocate CursorWindow \'/data/user/0/com.iSales/databases/isales_store\' of size 2097152 due to error -24.\nE/AndroidRuntime: FATAL EXCEPTION: AsyncTask #9\nProcess: com.iSales, PID: 10555\njava.lang.RuntimeException: An error occurred while executing doInBackground()\n    at android.os.AsyncTask$3.done(AsyncTask.java:365)\n    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)\n    at java.util.concurrent.FutureTask.setException(FutureTask.java:252)\n    at java.util.concurrent.FutureTask.run(FutureTask.java:271)\n    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)\n    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)\n    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)\n    at java.lang.Thread.run(Thread.java:784)\n Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. \n    at android.database.CursorWindow.<init>(CursorWindow.java:110)\n    at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)\n    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:138)\n    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)\n    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)\n    at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:258)\n    at com.iSales.database.dao.ServerDao_Impl.getActiveServer(ServerDao_Impl.java:478)\n    at com.iSales.remote.ApiUtils.getISalesRYImg(ApiUtils.java:90)\n    at com.iSales.task.FindAllVirtualProductsTask.doInBackground(FindAllVirtualProductsTask.java:72)\n    at com.iSales.task.FindAllVirtualProductsTask.doInBackground(FindAllVirtualProductsTask.java:25)\n    at android.os.AsyncTask$2.call(AsyncTask.java:345)\n    at java.util.concurrent.FutureTask.run(FutureTask.java:266)\n    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)\xc2\xa0\n    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)\xc2\xa0\n    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)\xc2\xa0\n    at java.lang.Thread.run(Thread.java:784)\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码 :

\n\n
for (int i = 0; i < produitEntries.size(); i++) {\nthis.mDb = null;\nthis.mDb = AppDatabase.getInstance(this.context);\nif (!produitEntries.get(i).getRef().contains("C") && !produitEntries.get(i).getRef().contains("P")) {\n    Call<ArrayList<ProductVirtual>> call = ApiUtils.getISalesRYImg(context).ryFindProductVirtual(produitEntries.get(i).getId());\n    try {\n        Response<ArrayList<ProductVirtual>> response = call.execute();\n        Log.e(TAG, "JSon: " + toJSON(response.body()));\n        if (response.isSuccessful()) {\n            ArrayList<ProductVirtual> productVirtualArrayList = response.body();\n            if (productVirtualArrayList.size() > 0) {\n                for (int z = 0; z < productVirtualArrayList.size(); z++) {\n                    mDb.virtualProductDao().insertVirtualProduct(productVirtualArrayList.get(z));\n                }\n            } else {\n                Log.e(TAG, "doInBackground: FindProductVirtualREST No Virtual Products");\n            }\n        }\n    } catch (IOException e) {\n        Log.e(TAG, "doInBackground: ********** IOException **********");\n        Log.e(TAG, "URL: " + call.request().url());\n        Log.e(TAG, "Message: " + e.getMessage());\n        Log.e(TAG, "StackTrace: " + e.getStackTrace());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n