SQLiteデータベースリークが見つかりました
-
29-09-2019 - |
質問
アプリケーションを作成しています。このエラーが発生しています:
11-08 13:46:24.665:エラー/データベース(443):java.lang.illegalstateException:/data/data/com.testproj/database/testdb
私はこれの理由を見つけることができないようです。これが私のコードです:
public class SQLiteAssistant extends SQLiteOpenHelper {
public SQLiteAssistant(Context context){
super(context, DB_NAME, null, DB_VERSION_NUMBER);
this.myContext = context;
}
public void openDataBase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public void closeDataBase() {
if(this.myDataBase != null) {
if(this.myDataBase.isOpen())
this.myDataBase.close();
}
}
}
}
別のクラスでは、これらのクエリがあります。
public class Db{
private static SQLiteAssistant sqlite;
public static String getSomeString(Context ctx) {
sqlite = new SQLiteAssistant(ctx);
sqlite.openDataBase();
Cursor cursor = sqlite.myDataBase.rawQuery("SELECT someColumn from SomeTable",null);
if (cursor != null) {
if (cursor.getCount()==1) {
if(cursor.moveToFirst()) {
String testString = cursor.getString(cursor.getColumnIndex("someColumn"));
cursor.close();
sqlite.closeDataBase();
sqlite.close();
return testString
}
}
}
sqlite.closeDataBase();
sqlite.close();
return null;
}
}
私の問題は、私が得る新しい活動を始めるときです AsyncTask
. 。このタスクはWebサービスからデータを取得し、のデータベースにアクセスします String
. 。これが次のとおりです AsyncTask
:
protected class BackTask extends AsyncTask<Context, String, String> {
@Override
protected String doInBackground(Context... params) {
try{
//get requeste data from the database
//access the web service
return result;
} catch (Exception e) {
return null;
}
return null;
}
}
アクティビティにコースを受講させると、すべてがうまくいきます。バックボタンをすばやく押していない場合は、エラーが発生します。この問題を解決する方法についての提案はありますか?
解決
あなたが使用しているかどうかわからない SQLiteOpenHelper
適切に...あなたはそれを必要としません myDataBase
フィールド、アイデアは、それがあなたのためにあなたのデータベース接続を管理するということです。そのようにサブクラスしないでください...あなたが物事をしていない限り onCreate()
ここに投稿されていないなど、使用できるように見えます SQLiteOpenHelper
直接、つまり:
SQLiteOpenHelper sqlite = new SQLiteOpenHelper(ctx, DB_PATH+DB_NAME, null,
DB_VERSION_NUMBER);
アクティビティを終了する必要があると仮定すると、バックグラウンドタスクも停止する必要があります。電話をかけることをお勧めします AsyncTask.cancel(true)
あなたから Activity.onPause()
. 。データベースがoncancelled()からクリーンアップされていることを確認してください。
また、バックグラウンドタスクがデータベースを読んでいる唯一のものである場合は、SQLiteOpenHelperインスタンスを所有してください。静的データでトラブルを起こすのは簡単なので、iMhoを避けるのが最善です。私はこのようなことをします:
protected class BackTask extends AsyncTask<String, Integer, String>
{
private SQLiteOpenHelper sqlite;
public void BackTask(Context ctx) {
sqlite = new SQLiteOpenHelper(ctx, DB_PATH+DB_NAME, null,
DB_VERSION_NUMBER);
}
@Override
protected String doInBackground(String... params)
{
try {
//get requeste data from the database
//access the web service
return result;
} catch (Exception e) {
}
return null;
}
@Override
protected void onCancelled() {
sqlite.close();
}
@Override
protected void onPostExecute(String result)
sqlite.close();
// Update UI here
}
}
他のヒント
私はこの部分だと思います:
cursor.close();
sqlite.closeDataBase();
sqlite.close();
最終的に近くにいる必要があります
Try{
//Do something
}
catch(){
//Catch exception
}
finally{
//Close cursor or/and eventually close database if you don't need it in the future
}
また、Ondestroyメソッドのデータベースを閉じることを忘れないでください。
onCreate(Bundle b){
//create database instance
}
onDestroy{
//close db
}