RoomDatabase - Не удалось выделить CursorWindow размером 2097152 из-за ошибки -24 - PullRequest
0 голосов
/ 19 февраля 2020

Я занимаюсь разработкой приложения 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());
    }
}

}

...