2012-04-13 1 views
4

나는이 방법SQLiteOpenHelper "onCreate"가 호출되지 않았습니까? 조각에서

fmdata = new FileManagerData(getActivity()); 

다음 클래스를 인스턴스화합니다 (DB가 존재하지 않습니다). 왜 onCreate()가 호출되지 않고 데이터베이스가 생성되지 않는지 이해할 수 없습니다.

public class FileManagerData { 
public static final String TAG = FileManagerData.class.getSimpleName();; 


Context context; 
DBHelper dbHelper; 

public FileManagerData (Context context){ 
    this.context = context; 
    dbHelper = new DBHelper(); 
} 

private class DBHelper extends SQLiteOpenHelper{ 

    private static final String DB_NAME = "filename.db"; 
    private static final String DB_SQL = "filename.sql"; 
    private static final int DB_VERSION = 1; // internal number 

    public DBHelper() { 
     super(context, DB_NAME, null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
      // this is NEVER called and my DB does not exist yet 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 

편집 : 트릭은 데이터베이스가 호출되는()에서 onCreate 있도록 (읽거나 쓰기 위해) 사용되어야한다는 것이다.

+1

DBHelper를 먼저 열거 나 사용해야합니까? –

+0

이것은 좋은 팁이었습니다. 대답으로 표시하여 받아 들일 수 있습니다. – znat

답변

11

가 DB에 처음 액세스 한 후 호출됩니다 onCreate 방법. DB에 질의를하고 onCreate이 호출됩니다.

3

아마 데이터베이스가 이전 시도에서 존재합니다.

앱을 제거한 다음 다시 시도하십시오.

+0

이미 시도했는데 ... 문제가 아닙니다. – znat

0

당신은에서 onCreate이에 넣어해야합니다

sqLiteDatabase.execSQL("create table" + DB_NAME + " (_id integer primary key autoincrement, " + fieldOne + "INTEGER, " + fieldTwo + "INTEGER);"); 

어디 fieldOne 및 fieldTwo는 테이블의 컬럼의 이름입니다. 또한 이쪽을 봐 : http://www.sqlite.org/datatype3.html

0

이 스레드는 이미 답변을 받아 들였습니다.

내가 가진 :

protected class OpenHelper extends SQLiteOpenHelper { 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     try { 
      MHSqlDb.this.createTables(db); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

것은 내가이 전화 해요 : Neverthless 방지이 내가 추가해야 할 것입니다

iOpenHelper = new OpenHelper(iDbFileName, DATABASE_VERSION); 

databese 파일이 단계에서 존재하지 않습니다.

그런 다음 앱을 디버깅합니다. 내가

iOpenHelper.getReadableDatabase(); 

이 나도는 데이터베이스 파일이 아직 존재하지 않는

iOpenHelper.getWritableDatabase(); 

호출하지 호출하지 않습니다. 이제 디버거에서 응용 프로그램을 죽일 때 갑자기 데이터베이스 파일 (iDbFileName의 이름 포함)이 생성 된 것을 볼 수 있습니다. OpenHelper의 onCreate 메서드는 호출되지 않습니다.

그래서 데이터베이스 파일이 존재하지 않고 getReadableDatabase() 또는 getWritableDatabase()가 호출 될 때 onCreate 메소드의 의도가 호출되는 것으로 보입니다. 이는 분명히 항상 그런 것은 아닙니다.

0

응용 프로그램을 제거하면 db가 제거되므로 다음 실행시 onCreate가 호출됩니다.

관련 문제