Android Sqlite getReadableDatabase

时间:2012-11-08 07:46:23

标签: android sqlite

任何身体都可以帮助我。我正在做时间表应用程序,所以使用数据库。

我的程序崩溃了:

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;

}

}

如果有人能帮助我,我会非常高兴,因为这是我的最后一年项目:)

1 个答案:

答案 0 :(得分:4)

您的Context很可能为空。尽量只使用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()。如果您致电它,Cursor中的Activity会抛出“空”的错误。

要发布Cursors等,我建议使用onPause()的{​​{1}}或onDestroy()方法,但这也取决于方法的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(); } } } String或其他数据类型,所以在这里应该在游标数据库上调用List<T>方法来获得干净的解决方案。

但是我如何看待从数据库返回获取数据的方法,不要在 db 上调用close()方法。

希望它能帮助同事。