如何在AsyncTask中使用SQLite数据库?

7
我一直在使用Activity类来访问我的数据库,这有时会导致程序冻结。
因此,我决定改用AsyncTask来处理数据库。
我的问题是我不知道如何从AsyncTask的类中实例化我的SQLite数据库"TheDB"。
public class myClass extends AsyncTask<Void, Void, Void>{
private TheDB db;

any method() {
    this.db = new TheDB(this);  //<-- Error here
}

这个方法在Activity类中可以正常运行,但是我不知道如何在这里使用它。

TheDB的构造函数是TheDB(Context context),但是这个类不是一个“context”,那么我该如何在这里使用我的数据库呢?

如果您可以,请提供示例。

请不要给我谷歌参考链接,因为我是新手,很难理解。

4个回答

9

在这里需要传递应用程序上下文

this.db = new TheDB(getApplicationContext());

兄弟,我尝试过了,但它显示"方法getApplicationContext()在myClass类型中未定义",有什么建议吗?! - ZiGi
3
您需要将Async任务作为内部类在您的活动中实例化。 - Manish Khot

6
import android.content.Context;

public class SuperTask extends AsyncTask<Void, Void, Void> {
    private final Context mContext; 

    public SuperTask(Context context) {
        super();
        this.mContext = context
    }

    protected Void doInBackground(Void... params) {
        // using this.mContext
    }
}

public class MainActivity extends Activity {
    // and run from Activity
    public void onButtonClick(View view) {
        new SuperTask(this.getApplicationContext()).execute(); 
    }
}

0

我看到有两种方法:

  1. 将上下文对象传递给您的AsyncTask构造函数,然后像这样实例化数据库:this.db = new TheDB(context);

  2. 或者您可能可以将实际的数据库对象传递给构造函数,但第一种方法似乎更好。


-1
学习编程的重要部分是学习阅读和理解文档。就文档而言,Android文档非常详细,因此了解它们的工作方式真的很值得你花时间去学习。
正如您在AsyncTask docs中所看到的,AsyncTask中没有onCreateonExecute方法。
文档清楚地介绍了AsyncTask的4个主要函数:onPreExecute()doInBackground(Params...)onProgressUpdate(Progress...)onPostExecute(Result)
您实例的可能选择是onPreExecute()doInBackground(Params...)。区别在于是否希望初始化在UI线程上进行。如果不是,请在doInBackground(Params...)中执行。

嗨兄弟,感谢快速回复。我已经使用Eclipse IDE自动实现了这些,但是无论在哪里使用“this.db = new TheDB(this);”,“this”都不是上下文,因此不能用于实例化数据库。那么如何从此类中使用数据库?是否有其他方法? - ZiGi
正如khotmanship所说,您可以在Activity内部使用内部类来访问活动的上下文。 - Cheryl Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接