2013-03-29 3 views
2

Я видел много сообщений здесь об этом, но я просто не могу получить мое приложение, чтобы остановить прислал мне ошибки обо мне, не закрывая БД. моя БД иногда зависит от активности, а иногда от фонового класса (службы).Когда есть необходимость закрыть базу данных?

я добавил к деятельности, используя БД

protected void onDestroy() { 
    Log.d("OnDestroy", "called"); 
    sqlAdapter helper = new sqlAdapter(StartScreen.this); 
    helper.close(); 
    super.onDestroy(); 
} 

как предложено здесь во многом посте, но оно не решает проблему.

любые идеи или объяснения, чтобы помочь мне понять? приложение не сбой или что-то, кроме большой ошибки обо мне, не закрывая БД

спасибо!

+1

Всегда сбрасывайте, что вы утверждали? – hd1

ответ

0

В вашем примере, кажется, что вы создаете новый объект в onDestroy и не закрываете старые. Таким образом, каждый раз, когда вы

sqlAdapter helper = new sqlAdapter(StartScreen.this); 

Вы создаете новый объект, и вы будете иметь тонну незакрытые ссылки и это то, что вызывает предупреждения.

Вместо этого, похоже, что вы можете найти шаблон дизайна singleton, который позволит вам поддерживать один объект в вашем приложении, а затем закрыть его в onDestroy.

public void onDestroy() { 
    super.onDestroy(); 
    // close database 
    final MySqlHelper helper = MySqlHelper.getInstance(); 
    helper.getDatabase().close(); 
} 

В противном случае он остается открытым до onDestroy так же, как вы пытаетесь сделать сейчас. Это, конечно, следует использовать, если это необходимо, и вы активно используете его в своем приложении. Если вы редко используете базу данных, вы будете просто закрывать ее после каждого использования.

Идея заключается в том, что Вы уменьшаете БД При открытых/близкие вызовы, если вы делаете умеренное количество из них и будет более эффективным в том случае использования.

Вот очень, очень урезанный пример синглтона.

public class MySqlHelper extends SQLiteOpenHelper { 
    static MySqlHelper mInstance = null; 
    static SQLiteDatabase mDatabase = null; 

    public static MySqlHelper getInstance() { 
     if (mInstance == null) { 
      // call private constructor 
      mInstance = new MySqlHelper(); 
     } 
     mDatabase = mInstance.getWritableDatabase(); 
     while(mDatabase.isDbLockedByCurrentThread() || mDatabase.isDbLockedByOtherThreads()) { 
      // loop until available 
     } 
     return mInstance; 
    } 

    private MySqlHelper() { 
     // mContext here is just a placeholder for your ApplicationContext 
     // that you should have available to this class. 
     super(mContext, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // all other filled out methods like onCreate, onUpgrade, etc 
} 

Теперь вы можете использовать это, чтобы реализовать ваш DataSource

public class MyDataSource { 
    // Database fields 
    private final SQLiteDatabase mDatabase; 
    private final MySqlHelper mHelper; 

    public MyDataSource() { 
     mHelper = MySqlHelper.getInstance(); 
     mDatabase = mHelper.getDatabase(); 
    } 

    // add your custom methods 

    private int update(ContentValues values, String whereClause) { 
     int rowsUpdated = 0; 
     synchronized (mDatabase) { 
      rowsUpdated = mDatabase.update(MySqlHelper.TABLE_NAME, values, whereClause, null); 
     } 
     return rowsUpdated; 
    } 

    public int updateById(ContentValues values, int id) { 
     final String whereClause = MySqlHelper.COLUMN_ID + "=" + id; 
     return this.update(values, whereClause); 
    } 
} 
+0

идеальное объяснение !!! благодаря! –

0

Вы должны закрыть его каждый раз, когда будете готовы. Если вы создадите cursor для доступа к нему, после получения данных и сохранения или завершения обработки на нем, вы должны закрыть cursor. Затем вы снова откроете его в следующий раз, когда вам это понадобится. This answer должен помочь вам

+0

Я просто хочу указать, что это не обязательно верно в тех случаях, когда вы используете пулы соединений. Я не думаю, что это имеет место в этой ситуации, но закрытие соединений при использовании пула соединений приводит к тому, что используется пул соединений. – CodeChimp

Смежные вопросы