CursorWindowAllocationException en el método ORMLite estándar

Necesito guardar algunos objetos en DB. Estoy usando este código en mi clase Dao.

public void saveActions(List<Action> actionList) throws SQLException { for (Action action : actionList) { createOrUpdate(action); } } 

Y a veces tengo CursorWindowAllocationException en la función createOrUpdate() .

Aquí hay stacktrace de error.

Java.lang.RuntimeException: Se ha producido un error al ejecutar doInBackground () en android.os.AsyncTask $ 3.done (AsyncTask.java:300) en java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:355) en java. Util.concurrent.FutureTask.setException (FutureTask.java:222) en java.util.concurrent.FutureTask.run (FutureTask.java:242) en android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:231) at Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) en java.lang.Thread.run (Thread.java:841) Causado por: android.database.CursorWindowAllocationException: La asignación de ventana de cursor de 2048 kb falló. En android.database.CursorWindow. (CursorWindow.java:109) en android.database.CursorWindow. (CursorWindow.java:100) en android.database.AbstractWindowedCursor.clearOrCreateWindow (AbstractWindowedCursor.java:198) en android.database.sqlite. SQLiteCursor.clearOrCreateWindow (SQLiteCursor.java:301) en android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:139) en android.database.sqlite.SQLiteCursor.getCount (SQLiteCursor.java:133) en android.database.AbstractCursor .moveToPosition (AbstractCursor.java:197) en android.database.AbstractCursor.moveToFirst (AbstractCursor.java:237) en com.j256.ormlite.android.AndroidDatabaseResults.first (SourceFile: 73) en com.j256.ormlite.android. AndroidDatabaseConnection.queryForLong (SourceFile: 234) en com.j256.ormlite.stmt.StatementExecutor.ifExists (SourceFile: 603) en com.j256.ormlite.dao.BaseDaoImpl.idExists (SourceFile: 807) en com.j256.ormlite.dao .BaseDaoImpl.createOrUpdate (SourceFile: 335) en com.deliveryclub.command.db.SaveActionsCommand.execute (Sourc EFile: 11) en ru.surfstudio.command.CommandExecutor.executeCommand (SourceFile: 34) en ru.surfstudio.background.CommonAsyncTask.doInBackground (SourceFile: 10) en android.os.AsyncTask $ 2.call (AsyncTask.java:288) En java.util.concurrent.FutureTask.run (FutureTask.java:237) … 4 más android.database.CursorWindowAllocationException: Asignación de ventana de cursor de 2048 kb no. En android.database.CursorWindow. (CursorWindow.java:109) en android.database.CursorWindow. (CursorWindow.java:100) en android.database.AbstractWindowedCursor.clearOrCreateWindow (AbstractWindowedCursor.java:198) en android.database.sqlite. SQLiteCursor.clearOrCreateWindow (SQLiteCursor.java:301) en android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:139) en android.database.sqlite.SQLiteCursor.getCount (SQLiteCursor.java:133) en android.database.AbstractCursor .moveToPosition (AbstractCursor.java:197) en android.database.AbstractCursor.moveToFirst (AbstractCursor.java:237) en com.j256.ormlite.android.AndroidDatabaseResults.first (SourceFile: 73) en com.j256.ormlite.android. AndroidDatabaseConnection.queryForLong (SourceFile: 234) en com.j256.ormlite.stmt.StatementExecutor.ifExists (SourceFile: 603) en com.j256.ormlite.dao.BaseDaoImpl.idExists (SourceFile: 807) en com.j256.ormlite.dao .BaseDaoImpl.createOrUpdate (SourceFile: 335) en com.deliveryclub.command.db.SaveActionsCommand.execute (Sourc EFile: 11) en ru.surfstudio.command.CommandExecutor.executeCommand (SourceFile: 34) en ru.surfstudio.background.CommonAsyncTask.doInBackground (SourceFile: 10) en android.os.AsyncTask $ 2.call (AsyncTask.java:288) En java.util.concurrent.FutureTask.run (FutureTask.java:237) en android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:231) en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1112) en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) en java.lang.Thread.run (Thread.java:841)

Clase de acción UPD

  @SuppressWarnings("serial") @DatabaseTable(tableName = "Action") public class Action implements Serializable { public static final String SERVICE_ID = "SERVICE_ID"; public static final String CITY_ID = "CITY_ID"; public static final String CATEGORY_ID = "CATEGORY_ID"; public static final String TITLE = "TITLE"; public static final String SERVICE_TITLE = "SERVICE_TITLE"; public static final String DESCRIPTION = "DESCRIPTION"; public static final String DEADLINE = "DEADLINE"; public static final String PERCENTAGE = "PERCENTAGE"; public static final String PICTURE_URL = "PICTURE_URL"; @DatabaseField(columnName = SERVICE_ID, id = true, useGetSet = true) private int serviceId; @DatabaseField(columnName = CITY_ID, useGetSet = true) private int cityId; @DatabaseField(columnName = CATEGORY_ID, useGetSet = true) private int categoryId; @DatabaseField(columnName = TITLE, useGetSet = true) private String title; @DatabaseField(columnName = SERVICE_TITLE, useGetSet = true) private String serviceTitle; @DatabaseField(columnName = DESCRIPTION, useGetSet = true) private String description; @DatabaseField(columnName = DEADLINE, useGetSet = true) private Date deadline; @DatabaseField(columnName = PERCENTAGE, useGetSet = true) private int percentage; @DatabaseField(columnName = PICTURE_URL, useGetSet = true) private String pictureUrl; public Action() { } public int getServiceId() { return serviceId; } public void setServiceId(int serviceId) { this.serviceId = serviceId; } public int getCityId() { return cityId; } public void setCityId(int cityId) { this.cityId = cityId; } public int getCategoryId() { return categoryId; } public void setCategoryId(int categoryId) { this.categoryId = categoryId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getServiceTitle() { return serviceTitle; } public void setServiceTitle(String serviceTitle) { this.serviceTitle = serviceTitle; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getDeadline() { return deadline; } public void setDeadline(Date deadline) { this.deadline = deadline; } public int getPercentage() { return percentage; } public void setPercentage(int percentage) { this.percentage = percentage; } public String getPictureUrl() { return pictureUrl; } public void setPictureUrl(String pictureUrl) { this.pictureUrl = pictureUrl; } 

¿Alguien tiene solución de este problema?

Si busca el origen de CursorWindowAllocationException se lee:

Esta excepción se activa cuando no se puede asignar una CursorWindow, probablemente debido a que la memoria no está disponible.

Si sigue la pila, verá que la llamada com.j256.ormlite.android.AndroidDatabaseConnection.queryForLong está creando un cursor para cada llamada createOrUpdate .

Así que lo que probablemente ocurre aquí es que hay demasiados Cursors se crean antes de que se libere la memoria.

Debe ejecutar estas llamadas en una transacción o, mejor aún, utilizar tareas por lotes . P.ej

 actionDao.callBatchTasks(new Callable<Void>() { public Void call() throws SQLException { for (Action action : actionList) { actionDao.createOrUpdate(action); } return null; } }); 

Debe llamar a cursor.close(); In finally {} cuando ya no necesite cursor. La asignación del cursor fallará si no llama a close () al cursor después de algún tiempo cuando los recursos del sistema para la asignación del cursor no estarán disponibles.

  • ¿Debo abrir () y cerrar () mi base de datos SQL constantemente o dejarla abierta?
  • Android, Ormlite, ubicación de DB
  • Android, cómo ejecutar un archivo sql en sqlitedatabase
  • Problema en sqlite con "como" en android
  • El contenido de Android contentprovider lleva mucho tiempo
  • Una buena biblioteca de ORM de Java en Android
  • ¿Cuál es la forma correcta de hacer inserciones / actualizaciones / eliminaciones en Android SQLiteDatabase utilizando una cadena de consulta?
  • Configurar una base de datos de servidor en línea y codificar mi aplicación nativa de Android para interactuar con ella
  • Cómo obtener datos de Azure DB Table en una aplicación de Android?
  • Instrucciones de inserción múltiple android sqlite
  • Android con SQL Server 2008
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.