0

私はクラス CreateDB を持っています

public class CreateDB extends SQLiteOpenHelper{   // SQLiteOpenHelper auto create if db not exists.

    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "mydb.db";

    public CreateDB(Context ctx) {
        super(ctx, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE friends (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phonenumber INTEGER);");
    }}

バックグラウンドスレッドとして機能する別のクラスでcreatedbを呼び出します

public class manager extends AsyncTask<Void, Void, String> {

 public  Context context;

    @Override
    protected String doInBackground(Void... params) {

        CreateDB dbhelp = new CreateDB(context);
}

}

私がそれを実行すると、動作が停止し、エミュレーターはアプリが応答を停止するというエラーを出します

しかし、「CreateDB dbhelp = new CreateDB(this);」を実行すると、主な活動では、それが機能し、データベースが作成されます。バックグラウンドスレッドでデータベースを作成できるように助けてください。

4

2 に答える 2

2

しかしCreateDB dbhelp = new CreateDB(this);、メインアクティビティで実行すると動作し、データベースが作成されます

contextでオブジェクトを初期化するのを忘れたためですAsyncTask

public class manager extends AsyncTask<Void, Void, String> {

 public  Context context; <-- Declared but not initialized

    @Override
    protected String doInBackground(Void... params) {

        CreateDB dbhelp = new CreateDB(context);
}

AsyncTask のコンストラクターを作成できます。

public manager(Context context) {
   this.context = context;
}

そして、あなたの活動で:

new manager(this).execute();

また、命名規則を尊重するようにしてください。

于 2013-10-26T10:00:17.910 に答える
0

有効なコンテキストをパラメーターとして渡す必要があります。

CreateDB dbhelp = new CreateDB(getContext());
于 2013-10-26T10:01:08.597 に答える