2012-11-08 41 views
1

任何機構都可以幫助我。我正在做時間表應用程序,所以使用數據庫。Android Sqlite getReadableDatabase

我的程序崩潰的位置:

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

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

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

       db.close(); 

我的數據庫處理器類是在這裏:

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

我只需要獲取數據庫中的所有數據 – Alibek

+0

這很簡單,只需比較你的代碼:http://dj-android.blogspot.in/2011/11/sqlite-database-with-cursor-adapter-in .html&http://www.vogella.com/articles/AndroidSQLite/article.html&http://dj-android.blogspot.in/2012/10/android-show-data-from-sqlite-db-into .html,網上有這麼多的教程。 –

+1

這將有助於*不*保留錯誤信息的祕密。 –

回答

3

最有可能您的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()。如果你叫它,你的CursorActivity會拋出「空」的錯誤。

要釋放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(); 
     } 
    } 
} 

方法,你用光標工作,數據庫和他們返回例如StringList<T>或其他數據類型,因此這裏也應該調用close()方法上遊標數據庫有乾淨的解決方案。

但我怎麼會帶來大約從數據庫返回獲取的數據,也不要稱呼分貝close()方法方法。

希望它能幫助同事。

+0

對不起,但爲什麼finally塊沒有看到你的例子中的數據庫變量,我的意思是要求創建本地變量之外嘗試塊 – Alibek

+0

對不起,我已經修好了。是的,你需要在try之外聲明變量。 – Sajmon

+0

答案被找到了! 主要問題是在onCreate方法中的查詢,條目之間沒有空白,所以愚蠢:) – Alibek

相關問題