title: Android SQLite: attempt to re-open an already-closed object
body: <p>I'm trying to get certain book data from my Inventory table based on the ISBN. 
  However, I'm getting an error: "attempt to re-open an already-closed object". The error only occurs when I click a listView object, go to a different screen, go back to this page via "finish()", and then try to click on another listView object. I moved the <code>String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);</code> from the <code>onClickListener</code> to the previous <em>for loop</em> before the <code>onClickListener</code> and now it works. </p>
  
  <p>Why does it not work if I try to getInventoryEntriesByISBN after returning to this activity from another activity via "finish()"? </p>
  
  <p>The error occurs at SearchResultsScreen:</p>
  
  <pre><code>String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);
  </code></pre>
  
  <p>and by extension, occurs at InventoryAdapter:</p>
  
  <pre><code>Cursor cursor = db.rawQuery(query, new String[] {ISBN});
  </code></pre>
  
  <p><strong>SearchResultsScreen.java</strong></p>
  
  <pre><code>// Set up search array
      for(int i = 0; i &lt; isbn.length; i++)
      {
          searchArray.add(new InventoryItem(isbn[i], InventoryAdapter.getTitleAndAuthorByISBN(isbn[i])));
      }
      Toast.makeText(getApplicationContext(), "searchArray.size()="+searchArray.size(), Toast.LENGTH_LONG).show();
  
      // add data in custom adapter
      adapter = new CustomAdapter(this, R.layout.list, searchArray);
      ListView dataList = (ListView) findViewById(R.id.list);
      dataList.setAdapter(adapter);
  
      // On Click ========================================================
      dataList.setOnItemClickListener(new OnItemClickListener() {
          @Override
          public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position,
                  long id) {
              String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);
  </code></pre>
  
  <p><strong>InventoryAdapter.java (Most relevant parts)</strong></p>
  
  <pre><code>public String[] getInventoryEntriesByISBN(String search, String ISBN)
  {
      String[] searchEntry = new String [9];
      //Query
      String query = "select * from INVENTORY where ISBN = ?";
      Cursor cursor = db.rawQuery(query, new String[] {ISBN});
      if(cursor.getCount()&lt;1) // title Not Exist
      {
          cursor.close();
          for(int i = 0; i &lt; 9; i++)
              searchEntry[i] = "Not Found";
          return searchEntry;
      }
      cursor.moveToFirst();
  
      //put data into respective variable
      int publish = cursor.getInt(cursor.getColumnIndex("PUBLISH_DATE"));
      String publishdate = ((Integer)publish).toString();
      String title = cursor.getString(cursor.getColumnIndex("TITLE"));
      String author = cursor.getString(cursor.getColumnIndex("AUTHOR"));
      String callNumber = cursor.getString(cursor.getColumnIndex("CALL_NUMBER"));
      int available = cursor.getInt(cursor.getColumnIndex("AVAILABLE_COUNT"));
      String availablecount = ((Integer)available).toString();
      int inventory = cursor.getInt(cursor.getColumnIndex("INVENTORY_COUNT"));
      String inventorycount = ((Integer)inventory).toString();
      int due = cursor.getInt(cursor.getColumnIndex("DUE_PERIOD"));
      String dueperiod = ((Integer)due).toString();
      int checkoutcount = cursor.getInt(cursor.getColumnIndex("COUNT"));
      String count = ((Integer)checkoutcount).toString();
      //combine variables into one array
      searchEntry[0] = ISBN;
      searchEntry[1] = title;
      searchEntry[2] = author;
      searchEntry[3] = publishdate;
      searchEntry[4] = callNumber;
      searchEntry[5] = availablecount;
      searchEntry[6] = inventorycount;
      searchEntry[7] = dueperiod;
      searchEntry[8] = count;
  
      cursor.close();
      return searchEntry;
  }
  
  public String getTitleAndAuthorByISBN(String ISBN)
      {
          int entriesFound = getNumSearchEntries(ISBN);
          if(entriesFound==0)
              entriesFound = 1;
          String searchEntry;
          //Query
          String query = "select * from INVENTORY where ISBN = ?";
          Cursor cursor = db.rawQuery(query, new String[] {ISBN});
          if(cursor.getCount()&lt;1) // title Not Exist
          {
              cursor.close();
              searchEntry = "Not Found";
              return searchEntry;
          }
          cursor.moveToFirst();
          //put data into respective variable
          String title = cursor.getString(cursor.getColumnIndex("TITLE"));
          String author = cursor.getString(cursor.getColumnIndex("AUTHOR"));
          //combine variables into one String
          searchEntry = title + " / " + author;
          //close cursor and return
          cursor.close();
          return searchEntry;
      }
  </code></pre>
  
  <p><strong>DataBaseHelper.java</strong></p>
  
  <pre><code>public class DataBaseHelper extends SQLiteOpenHelper
  {   
  // Database Version
      private static final int DATABASE_VERSION = 1;
  
  // Database Name
  private static final String DATABASE_NAME = "database.db";
  
  // ============================ End Variables ===========================
  
  public DataBaseHelper(Context context, String name, CursorFactory factory, int version) 
  {
             super(context, name, factory, version);
  }
  
  public DataBaseHelper(Context context) {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }
  
  // Called when no database exists in disk and the helper class needs
  // to create a new one.
  @Override
  public void onCreate(SQLiteDatabase _db) 
  {
          _db.execSQL(LoginDataBaseAdapter.USER_TABLE_CREATE);
          _db.execSQL(CheckOutDataBaseAdapter.CHECKOUT_TABLE_CREATE);
          _db.execSQL(InventoryAdapter.INVENTORY_TABLE_CREATE);
          _db.execSQL(StatisticsAdapter.STATISTICS_TABLE_CREATE);
  }
  // Called when there is a database version mismatch meaning that the version
  // of the database on disk needs to be upgraded to the current version.
  @Override
  public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) 
  {
          // Log the version upgrade.
          Log.w("TaskDBAdapter", "Upgrading from version " +_oldVersion + " to " +_newVersion + ", which will destroy all old data");
  
  
          // Upgrade the existing database to conform to the new version. Multiple
          // previous versions can be handled by comparing _oldVersion and _newVersion
          // values.
          // on upgrade drop older tables
          _db.execSQL("DROP TABLE IF EXISTS " + LoginDataBaseAdapter.USER_TABLE_CREATE);
          _db.execSQL("DROP TABLE IF EXISTS " + CheckOutDataBaseAdapter.CHECKOUT_TABLE_CREATE);
          _db.execSQL("DROP TABLE IF EXISTS " + InventoryAdapter.INVENTORY_TABLE_CREATE);
          _db.execSQL("DROP TABLE IF EXISTS " + StatisticsAdapter.STATISTICS_TABLE_CREATE);
  
          // Create a new one.
          onCreate(_db);
  }
  
  }
  </code></pre>