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()
.
- Atascado con diseño de SQL android utilizando SQLite y Group By
- Cómo leer una columna específica de SQLiteBatabase existente en Android?
- Aplicación Android phonegap que tiene problemas con SQlite y almacenamiento local en dispositivos Samsung Galaxy
- ¿Preguntas con declaraciones preparadas en Android?
- Android - ¿Existe la base de datos SQLite?
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?
- Relación activa de muchos a muchos de Android
- Error en sqlite "DROP TABLE IF EXISTS" android
- No se pudo asignar CursorWindow
- ¿Cómo puedo comprobar si mi tabla sqlite contiene datos?
- Cómo obtener el valor de la columna Timestamp en android mediante cursor
- ¿Cómo puedo agregar una columna en onUpgrade y establecer las filas existentes en un valor determinado?
- Orden de consulta de SQlite por caso
- Cómo diferenciar dos tablas
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.
- Eliminación del indicador de foco de RecycleView en Android
- Cambiar el ancho y la altura de la vista personalizada en Android