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是空的。尝试使用 justthis而不是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(). 如果你调用它,你的CursorinActivity将抛出“为空”的错误。

要发布Cursors等,我建议使用onPause()oronDestroy()方法,Activity但也取决于Context方法。

因此,如果您的方法用于从数据库中添加、更新或删除数据,那么在您的方法中,我建议您使用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();
       }
    }
}

您使用游标数据库以及它们返回的方法,例如StringList<T>或其他数据类型,因此您也应该在这里调用游标数据库close()上的方法以获得干净的解决方案。

但是我的意思是从数据库返回获取的数据的方法,不要在dbclose()上调用方法。

希望对同事有所帮助。

于 2012-11-08T08:01:18.290 回答