我正在创建一个应用程序。我得到这个错误:
11-08 13:46:24.665:错误/数据库(443):
java.lang.IllegalStateException:异常:
/data/data/com.testproj/databases/testdb sqlitedatabase已创建和
永不关闭
我似乎找不到原因,因为它有时会告诉我错误,有时不会。这是我的代码:

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
    }
}

关于android - 发现SQLite数据库泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4123749/

10-13 07:30
查看更多