Ошибка асинхронной задачи Android SQLite - PullRequest
0 голосов
/ 15 июня 2011
 private class UploadFilesTask extends AsyncTask<Object, Object, Object> {
    @Override
    protected Object doInBackground(Object... arg0) {  
        SQLiteDatabase db = dbs.getWritableDatabase(); 
ContentValues values = new ContentValues();
                        values.put(DBAdapter.KG_ID,  "q");
                        values.put(DBAdapter.KG_Used,  "False");
                        values.put(DBAdapter.KG_UsedDate,  "");
                    db.insert(DBAdapter.KG_ThisPDAIncidentIDPreAllocations, null, values);

В моем приложении, как только код попадет в строку SQLiteDatabase db = dbs.getWritableDatabase (); я получаю ошибку. Можно ли получить доступ к базе данных в AsynTask? Он находится в отдельном классе обслуживания.

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Получил работу ... нужно this.dbs = новый DBAdapter (getApplicationContext ());

0 голосов
/ 15 июня 2011

Вы пытались запустить SQLiteDatabase db = dbs.getWritableDatabase(); вне AsyncTask?

Если вы никогда раньше не запускали этот код, я мог бы иметь какое-то отношение к вашей базе данных, а не к AsyncTask.

Я знаю, что пару раз использовал базу данных внутри AsyncTask ...

Редактировать: Где создаются / объявляются БД? Я предполагаю, что это ваш SqlLiteHelper. Если бы вы заявили, что в вашей деятельности, то это будет частью потока пользовательского интерфейса. Попробуйте переместить объявление dbs в doInBackground(Object... arg0).

Если вы не можете переместить объявление dbs внутри doInBackgroud(Object... arg0) (используется в других местах в Activity), убедитесь, что оно объявлено с final

Я бы не рекомендовал пытаться передавать dbs или db в качестве параметра в doInBackground.

0 голосов
/ 15 июня 2011

Я бы попробовал отправить в базу через параметры. Таким образом, вы не вызываете методы пользовательского интерфейса из другого потока. Вот так.

UploadFilesTask extends AsyncTask<SQLiteDatabase, Void, SQLiteDatabase>
    @Override
protected SQLiteDatabase doInBackground(SQLiteDatabase... params) {
            //Do something with database and return it
            params[0].doSomeThing();
            return params[0];
}

@Override
protected void onPostExecute(SQLiteDatabase result) {
    //Here is the database after the processing
}

И вот как вы должны создать и вызвать AsyncTask.

UploadFilesTask task = new UploadFilesTask();
task.execute(dbs.getWritableDatabase());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...