在您的示例中,您似乎正在创建一个新对象onDestroy
而不是关闭旧对象。所以每次你做
sqlAdapter helper = new sqlAdapter(StartScreen.this);
您正在创建一个新对象,并且您将拥有大量未关闭的引用,这就是导致警告的原因。
相反,看起来您可能正在寻找一种单例设计模式,它允许您在应用程序中维护一个对象,然后在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
}
现在您可以使用它来实现您的数据源
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);
}
}