Я занимаюсь разработкой приложения android, используя Room Database link для локального сохранения данных. В простом запросе все работало правильно. Однако когда il oop через список данных для локального сохранения, я получаю CursorWindowAllocationException. При поиске в Google я должен закрыть курсор как «cursor.close ()», но как справиться с курсором в базе данных комнат?
Спасибо!
Ошибка:
Could not allocate CursorWindow '/data/user/0/com.iSales/databases/isales_store' of size 2097152 due to error -24.
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #9
Process: com.iSales, PID: 10555
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:365)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:784)
Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed.
at android.database.CursorWindow.<init>(CursorWindow.java:110)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:138)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:258)
at com.iSales.database.dao.ServerDao_Impl.getActiveServer(ServerDao_Impl.java:478)
at com.iSales.remote.ApiUtils.getISalesRYImg(ApiUtils.java:90)
at com.iSales.task.FindAllVirtualProductsTask.doInBackground(FindAllVirtualProductsTask.java:72)
at com.iSales.task.FindAllVirtualProductsTask.doInBackground(FindAllVirtualProductsTask.java:25)
at android.os.AsyncTask$2.call(AsyncTask.java:345)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:784)
Код:
for (int i = 0; i < produitEntries.size(); i++) {
this.mDb = null;
this.mDb = AppDatabase.getInstance(this.context);
if (!produitEntries.get(i).getRef().contains("C") && !produitEntries.get(i).getRef().contains("P")) {
Call<ArrayList<ProductVirtual>> call = ApiUtils.getISalesRYImg(context).ryFindProductVirtual(produitEntries.get(i).getId());
try {
Response<ArrayList<ProductVirtual>> response = call.execute();
Log.e(TAG, "JSon: " + toJSON(response.body()));
if (response.isSuccessful()) {
ArrayList<ProductVirtual> productVirtualArrayList = response.body();
if (productVirtualArrayList.size() > 0) {
for (int z = 0; z < productVirtualArrayList.size(); z++) {
mDb.virtualProductDao().insertVirtualProduct(productVirtualArrayList.get(z));
}
} else {
Log.e(TAG, "doInBackground: FindProductVirtualREST No Virtual Products");
}
}
} catch (IOException e) {
Log.e(TAG, "doInBackground: ********** IOException **********");
Log.e(TAG, "URL: " + call.request().url());
Log.e(TAG, "Message: " + e.getMessage());
Log.e(TAG, "StackTrace: " + e.getStackTrace());
}
}
}