Android SQLite异步任务错误

时间:2011-06-15 15:19:08

标签: android sqlite android-asynctask

 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 个答案:

答案 0 :(得分:1)

让它工作......需要this.dbs = new DBAdapter(getApplicationContext());

答案 1 :(得分:0)

我会尝试通过参数发送数据库。这样你就不会从另一个线程调用UI方法。像这样。

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());

答案 2 :(得分:0)

您是否尝试过在AsyncTask之外运行SQLiteDatabase db = dbs.getWritableDatabase();

如果您在我可以处理数据库而不是AsyncTask之前从未运行过该代码。

我知道我现在已经在AsyncTask中使用了几次数据库......

编辑:创建/声明dbs在哪里?我假设那是你的SqlLiteHelper。如果您在活动中声明了它,那么它将是UI线程的一部分。尝试在doInBackground(Object... arg0)内移动您的dbs声明。

如果您无法在doInBackgroud(Object... arg0)内部移动dbs声明(在Activity中的其他位置使用),请确保使用final

声明它

我不建议尝试将dbs或db作为参数传递给doInBackground。