Android SQLite Exception: невозможно закрыть из-за незавершенных операторов - PullRequest
9 голосов
/ 19 февраля 2012

Я пишу приложение для управления покупками Android и столкнулся с ошибкой при попытке закрыть одну из моих таблиц базы данных SQLite.

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

Этого не происходит с другими вызовами этого класса, поэтому мне интересно, так ли это, потому что здесь есть цикл с большим количеством обращений к базе данных. Ошибка SQLite Exception: unable to close due to unfinalised statements.

Строка ошибки из класса ItemsDb находится здесь

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

Очевидно, SQLite3 имеет метод finalize для уничтожения предыдущих вызовов БД, но я не уверен, как реализовать это или даже если это необходимо здесь.

Любая помощь в этом была бы великолепна.

1 Ответ

6 голосов
/ 21 февраля 2012

Кажется, проблема связана с курсором, спасибо Jivings. Я не закрывал курсор после запроса к базе данных, что означало, что некоторые ссылки на базу данных были недействительными.

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

Казалось, что "c.close" помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...