4

どうやら私が取得しているので、コンテキストと次の行にいくつかの問題がありますNullPointerException。文脈に何か問題があると思います。また、2つのアクティビティからデータベースを開いたり閉じたりしようとすると、CannotOpenORCloseDatabaseエラーがスローされます。助けてください。

DBHelper dbHelper = new DBHelper(this.getApplicationContext());

なぜですか?または、誰かが回避策を提案できれば素晴らしいと思います。

public static final String EXT_CATEGORY = "category";

public static final String EXT_URL = "url";

private String tableName = DBHelper.tableName;

private SQLiteDatabase MyDb;

private int category;
Cursor c = null;

public static final String EXT_POS = "position";
private String url;
private int position;
WebView mWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.v(LOG_TAG, "onCreate() called");
    super.onCreate(savedInstanceState);

    openAndQueryDatabase();

}

private void openAndQueryDatabase() {

    position = 1;
    category = 0;
    Log.v(LOG_TAG, "onCreate() called 3");
    try {

        DBHelper dbHelper = DBHelper.getInstance(getBaseContext());
        MyDb = dbHelper.getWritableDatabase();


        c = MyDb.rawQuery("SELECT * FROM " + tableName
                + " where Category =" + category + "AND Position ="
                + position, null);
        Log.v(LOG_TAG, "onCreate() called 4");
        // url = c.getString(c.getColumnIndex("Image"));
        url = "www.google.com";
        Log.v(url, " URL in Recipe ");
    } catch (SQLiteException se) {
        Log.e(getClass().getSimpleName(),
                "Could not create or Open the database");
    } 
4

4 に答える 4

3

DBHelperを静的インスタンス(シングルトン)として宣言して、常に1つのDBHelperのみが存在するようにする必要があります。

 public class DBHelper extends SQLiteOpenHelper { 

    private static DBHelper mInstance = null;

    public static DBHelper getInstance(Context activityContext) {

    // Get the application context from the activityContext to prevent leak
    if (mInstance == null) {
      mInstance = new DBHelper (activityContext.getApplicationContext());
    }
    return mInstance;
  }

  /**
   * Private, use the static method "DBHelper.getInstance(Context)" instead.
   */
  private DBHelper (Context applicationContext) {
    super(applicationContext, DATABASE_NAME, null, DATABASE_VERSION);
  }
}

SQLiteDatabaseを開くには、次を使用します。

SQLiteDatabase mDataBase = DBHelper.getInstance(context).getWritableDatabase();

そしてそれを閉じる

mDataBase.close();
于 2012-12-27T08:53:16.557 に答える
2

このためにコンストラクターを使用します...DBクラスを呼び出している間、パラメーターとしてコンテキストを渡します。以下のように。

    public class MyDB {

   private Context context;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public MyDB(Context ctx) 
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }
}

これがお役に立てば幸いです。

于 2012-12-27T08:34:41.937 に答える
2

これを試して

db = new DbHelper(this.getContext());

動作するはずです。

于 2016-12-27T19:00:17.060 に答える
1

あなたが使用している、DBHelper dbHelper = new DBHelper(this.getApplicationContext());

代わりに、

DBHelper dbHelper = new DBHelper(getApplicationContext());

編集-

使ってみてください

MyDb = getApplicationContext().getWritableDatabase();

それ以外の

DBHelper dbHelper = new DBHelper(this.getApplicationContext());

MyDb = dbHelper.getWritableDatabase();

また、この回答finally()で提案されているように、ブロックを削除してみてください。

于 2012-12-27T08:21:54.737 に答える