2012-11-08 4 views
1

어떤 몸이라도 나를 도와 줄 수 있습니다. 시간표 응용 프로그램을 만들고있어 데이터베이스 작업.안드로이드 Sqlite getReadableDatabase

내 프로그램은 여기에 충돌 :

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

데이터베이스의 모든 데이터를 가져와야합니다. – 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은 null입니다. 단지 this 대신 getApplicationContext()

dbHelper = new DatabaseHandler(this); 

주의를 사용해보십시오 : 나는 추천을 다음과 같이 오히려 그것을 할 : 당신이 Cursor을 반환하는 방법이있는 경우, db.close()를 호출해서는 안

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; 
} 

. 전화를 걸면 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(); 
     } 
    } 
} 

당신이 커서 작업 방법, 데이터베이스 그들은 예를 String, List<T> 정도도 여기에 다른 데이터 유형에 대한 반환 당신이 close() 메소드를 호출한다 커서데이터베이스 깨끗한 솔루션을 가지고 있습니다.

하지만 DBclose() 메소드를 호출하지 마십시오 데이터베이스에서 가져온 데이터를 반환하는 방법에 대해 의미하는 방법.

호프가 동료에게 도움이되기를 바랍니다.

+0

죄송 합니다만, finally 블록이 예제에서 db 변수를 보지 못하는 이유는 try 블록 외부에서 로컬 변수를 만들 것을 요청합니다. – Alibek

+0

죄송합니다. 이미 수정했습니다. 네, 시도 밖에서 변수를 선언해야합니다. – Sajmon

+0

답변을 찾았습니다! 주된 문제는 onCreate 메서드의 쿼리에서 항목 사이에 공백이 없으므로 바보 같았습니다. :) – Alibek