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中访问数据库吗?它位于一个单独的服务类中。
答案 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。