任何身体都可以帮助我。我正在做时间表应用程序,所以使用数据库。
我的程序崩溃了:
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;
}
}
如果有人能帮助我,我会非常高兴,因为这是我的最后一年项目:)
答案 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()
方法。
希望它能帮助同事。