2013-09-19 3 views
5

Так что, по сути, я дважды запрашиваю DB. Я не понимаю, откуда эта ошибка возникает, потому что я нигде не закрываю базу данных. Код, который возвращает ошибку, выполняется следующим образом. Я проверил, и я просто видел такой случай, как мой.попытка повторно открыть уже закрытый объект: sqlitequery

BeaconHandler pullAllDB = new BeaconHandler(this); 
    try { 
     List<Beacon> beaconsShown = pullAllDB.getAllBeacons(); 
     for (final Beacon bn : beaconsShown) { 
      try { 
       int messageCount = pullAllDB.getMessageCount(); 
       Log.d("Message", messageCount + " Messages Found"); 
       if (messageCount > 0) { 
        //Do Something 
       } else { 
        // Do Nothing 
       } 
      } 
      catch (Exception e) { 
       e.getStackTrace(); 
       Log.e("Message", e.getMessage()); 
      } 
     } 
    } 

И код делает запросы ...

public int getBeaconsCount() { 

    String countQuery = "SELECT * FROM " + TABLE_BASIC_BEACON; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(countQuery, null); 
    cursor.close(); 

    // return count 
    return cursor.getCount(); 

} 

public int getMessageCount() { 

    String mcountQuery = "SELECT * FROM " + MESSAGE_BEACON; 
    SQLiteDatabase mdb = this.getReadableDatabase(); 
    Cursor mcursor = mdb.rawQuery(mcountQuery, null); 
    mcursor.close(); 

    // return count 
    return mcursor.getCount(); 

} 

ответ

18

Вы должны опубликовать LogCat, если вы получаете сообщение об ошибке. Это помогает увидеть, какая строка вызывает вашу проблему.

Из документов для Android.

близко()

Закрывает курсор, выпустив все свои ресурсы и сделать это совершенно недопустимое.

Ваш призыв к mcursor.getCount() после закрытия его, вероятно, вызывает ошибку

Может быть, попробовать что-то вроде этого.

int count = mcursor.getCount(); 
mcursor.close(); 

// return count 
return count ; 
+0

Ничего себе, я не могу поверить, что я не брал на себя, что. Полагаю, иногда вам просто нужен еще один набор глаз. – TheHamstring

1

Я здесь в предположении, что pullAllDB ваш объект базы данных, который содержит код, делая запросы. В этом случае перед линией List<Beacon> beaconsShown = pullAllDB.getAllBeacons(); вы должны сделать что-то вроде pullAllDB.open(); и сделать pullAllDB.close(); после того, как вы закончите выполнение запросов.

Так что в целом, ваша функция будет выглядеть ..

try { 
    //open the database class here 
    pullAllDB.open(); 

    List<Beacon> beaconsShown = pullAllDB.getAllBeacons(); 
    for (final Beacon bn : beaconsShown) { 
     try { 
      int messageCount = pullAllDB.getMessageCount(); 
      Log.d("Message", messageCount + " Messages Found"); 
      if (messageCount > 0) { 
       //Do Something 
      } else { 
       // Do Nothing 
      } 
     } 
     catch (Exception e) { 
      e.getStackTrace(); 
      Log.e("Message", e.getMessage()); 
     } 

    //close the database here 
    pullAllDB.close(); 
    } 
} 
Смежные вопросы