5

i am developing an android application using Room Database link for saving data locally. In simple query, it worked properly. However when i loop through a list of data to save locally, i get CursorWindowAllocationException. By googling i should close me cursor like "cursor.close()" but how can handle cursor in Room Database ?

Thank you!

Error :

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)

Code :

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

}

JDevs
  • 101
  • 1
  • 11

0 Answers0