あなたの例では、新しいオブジェクトを作成していて、onDestroy
古いオブジェクトを閉じていないように見えます。だからあなたがするたびに
sqlAdapter helper = new sqlAdapter(StartScreen.this);
新しいオブジェクトを作成していますが、閉じられていない参照が大量にあり、これが警告の原因です。
代わりに、アプリケーションで 1 つのオブジェクトを維持し、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);
}
}