0

どんな体でも私を助けてくれませんか。私はタイムテーブルアプリケーションを行っているので、データベースを使用しています。

私のプログラムはここでクラッシュします:

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

                SQLiteDatabase db = dbHelper.getReadableDatabase(); //<---------------

                Cursor cur=null;
                 cur = dbHelper.fetchAll(db, "SELECT * FROM timetable");

                db.close();

私のDatabaseHandlerクラスはここにあります:

public DatabaseHandler (Context context) {

    super(context,DATABASE_NAME, null,DATABASE_VERSION);

}

//Creating Table
@Override
public void onCreate(SQLiteDatabase db){

    String CREATE_TABLE = "CREATE TABLE" + TABLE_NAME + "("
            + KEY_ID + "INTEGER PRIMARY KEY," + KEY_SUBJECT_NAME
            + "TEXT," + KEY_SUBJECT_CODE + "TEXT," + KEY_SUBJECT_VENUE
            + "TEXT," + KEY_TIME + "INTEGER," + KEY_DAY + "INTEGER" + ")";

    db.execSQL(CREATE_TABLE);
}

//Upgrading Database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

    // Create tables again
    onCreate(db);

}

 /**
 * All CRUD(Create, Read, Update, Delete) Operations
 */

//Insert data
public void insertValues(int day, int time, String name, String code, String venue) {

    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();

    values.put(KEY_DAY, day);
    values.put(KEY_TIME, time);
    values.put(KEY_SUBJECT_NAME, name);
    values.put(KEY_SUBJECT_CODE, code);
    values.put(KEY_SUBJECT_VENUE, venue);

    db.insert(TABLE_NAME, null, values);

    //closing the database connection
    db.close();
}

public Cursor fetchAll(SQLiteDatabase db, String query){

    Cursor cursor = db.rawQuery(query, null);
      db.close();
    return cursor;

}

}

誰かが私を助けてくれたら、これが私の最終年度のプロジェクトだからです:)

4

1 に答える 1

4

ほとんどの場合、あなたContextは null です。thisの代わりに使用してみてくださいgetApplicationContext()

dbHelper = new DatabaseHandler(this);

注:次のようにすることをお勧めします。

public Cursor fetchAll(SQLiteDatabase db, String query) {
    Cursor cursor;
    db = this.getReadableDatabase();
    if (db != null) {
       cursor = db.rawQuery(query, null); // also rather use query method, ist more saf
    }
    return cursor;
}

を返すメソッドがある場合はCursor、 を呼び出すべきではありませんdb.close()。それを呼び出すと、「空です」というエラーがスローされますCursorActivity

リリースなどには、またはの方法Cursorsを使用することをお勧めしますが、方法にもよります。onPause()onDestroy()ActivityContext

したがって、メソッドがデータベースからのデータの追加、更新、または削除に使用される場合は、メソッドでtry-finallyブロックを使用することをお勧めします。または、スパゲッティ コードなしでソリューションをクリーンにするためにtry-catch-finally呼び出す必要があります。db.close()

ほんの少しの例:

public boolean addRecord(String name, String pass, String value) {
    SQLiteDatabase db;
    try {
       db = this.getWritableDatabase();
       ContentValues data = new ContentValues();
       data.put(KEY_NAME, name);
       data.put(KEY_PASS, pass);
       data.put(KEY_VALUE, value);
       long result = db.insertOrThrow(TABLE_NAME, <nullColumnHack>, data);
       return result > 0;
    catch (SQLException ex) {
       Log.w("SQLException", ex.fillInStackTrace());
       return false;
    }
    finally {
       if (db != null) {
          db.close();
       }
    }
}

カーソルデータベースを操作し、たとえばString、または他のデータ型を返すメソッド。ここでも、カーソルデータベースでメソッドをList<T>呼び出して、クリーンなソリューションを得る必要があります。close()

しかし、データベースからフェッチされたデータを返すメソッドについてどのように意味したか、 dbclose()でメソッドを呼び出さないでください。

同僚に役立つことを願っています。

于 2012-11-08T08:01:18.290 に答える