【问题标题】:Android Sqlite getReadableDatabase [closed]Android Sqlite getReadableDatabase [关闭]
【发布时间】:2012-10-28 09:22:13
【问题描述】:

请任何人帮助我。我正在做时间表应用程序,所以使用数据库。

我的程序在这里崩溃:

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;

}

}

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

【问题讨论】:

标签: android sqlite


【解决方案1】:

您的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()。如果调用它,Activity 中的 Cursor 将抛出“为空”的错误。

要发布Cursors 等,我建议使用ActivityonPause()onDestroy() 方法,但也取决于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();
       }
    }
}

您使用 cursorsdatabase 的方法,它们返回例如 StringList&lt;T&gt; 或其他数据类型,因此您也应该在这里调用 @987654341 cursorsdatabase 上的 @ 方法以获得干净的解决方案。

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

希望对同事有所帮助。

【讨论】:

  • 抱歉,为什么 finally 块在您的示例中没有看到 db 变量,我的意思是它要求在 try 块之外创建局部变量
  • 对不起,我已经修好了。是的,您需要在 try 之外声明变量。
  • 答案找到了!主要问题是 onCreate 方法中的查询,条目之间没有空格,太愚蠢了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2012-12-09
  • 2011-06-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多