В вашем примере, кажется, что вы создаете новый объект в 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);
}
}
Всегда сбрасывайте, что вы утверждали? – hd1