2012-02-19 8 views
9

Estoy escribiendo una aplicación de administrador de compras de Android y he encontrado un error al intentar cerrar una de mis tablas de base de datos SQLite.Android SQLite Excepción: no se puede cerrar debido a declaraciones sin finalizar

ItemsDb idb = new ItemsDb(this); 

idb.open(); 

ArrayList<String> itemNames = idb.getItemNames(); 

for(int i=0; i < itemNames.size(); i++){ 

    String itemName = itemNames.get(i); 

    String itemID = idb.getItemID(itemName); 
    String itemName = idb.getItemNames().get(i); 
    String itemPrices = idb.getItemPrices().get(i); 
    String itemQuantity = idb.getItemQuantities().get(i);    
    String dateBought = idb.getDateBought(itemName);  
    String decayRate = idb.getDecayRate(itemName); 
    String decayType = idb.getDecayType(itemName); 
    String lastDecay = idb.getLastDecay(itemName); 
    String prevQuantity = idb.getPreviousQuantity(itemName); 
} 

idb.close(); 

Esto no sucede con otras llamadas a esta clase de modo y me pregunto si es porque hay un bucle con una gran cantidad de llamadas a la base de datos aquí. El error es SQLite Exception: unable to close due to unfinalised statements.

La línea de error de la clase "ItemsDb" es aquí

public ItemsDb(Context c){ 

     ourContext = c; 
    } 

    public ItemsDb open() throws SQLException{ 
     ourHelper = new DbHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close(){ 
     ourHelper.close(); 
    } 

Al parecer SQLite3 tiene un método de finalización de la destrucción de las llamadas anteriores DB pero no estoy seguro de cómo implementar esta o incluso si es necesario en este caso.

Cualquier ayuda sobre esto sería genial.

+0

¿Está utilizando algún cursor en sus extractos? – Jivings

Respuesta

6

Parece que el problema estaba relacionado con el cursor, gracias a Jivings. No estaba cerrando el cursor después de haber consultado la base de datos, lo que significaba que ciertas referencias a la base de datos no eran válidas.

public String getName(String id) throws SQLException{ 
    String[] columns = new String[]{ KEY_ItemID, KEY_NAME}; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ItemID + "='" + id + "'", null, null, null, null); 
    if(c != null){ 
     c.moveToFirst(); 
     String name = c.getString(1); 
     c.close(); 
     return name; 
    } 
    return null; 
} 

Llamando "c.close" pareció hacer el truco.

Cuestiones relacionadas