SQLiteOpenHelper onCreate не вызывается? (БД не существует)

Из фрагмента я создаю экземпляр таким образом

fmdata = new FileManagerData(getActivity());

следующий класс. Я не понимаю, почему 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) {

    }   
}

EDIT: Хитрость в том, что база данных должна использоваться (для чтения или записи), поэтому вызывается onCreate().


person znat    schedule 13.04.2012    source источник
comment
Вам нужно сначала открыть/использовать DBHelper?   -  person    schedule 14.04.2012
comment
это был хороший совет, пожалуйста, отметьте его как ответ, чтобы я мог принять его и проголосовать за него   -  person znat    schedule 14.04.2012


Ответы (5)


Метод onCreate будет вызываться после первого доступа к БД. Сделайте запрос к БД, и onCreate будет вызван.

person marwinXXII    schedule 13.04.2012

Вероятно, база данных существует с более ранней попытки.

Удалите приложение и повторите попытку.

person stefan bachert    schedule 13.04.2012

Вы должны поместить в onCreate это:

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

Где fieldOne и fieldTwo — имена столбцов вашей таблицы. Также посмотрите здесь: http://www.sqlite.org/datatype3.html

person Geralt_Encore    schedule 13.04.2012

Я знаю, что эта тема уже приняла ответ. Тем не менее, это то, что я должен добавить:

я имею:

    protected class OpenHelper extends SQLiteOpenHelper {

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

Я вызываю это:

    iOpenHelper = new OpenHelper(iDbFileName, DATABASE_VERSION );

На данном этапе файл базы данных не существует.

Затем я делаю некоторую отладку приложения. я никогда не звоню

    iOpenHelper.getReadableDatabase();

ни я звоню

    iOpenHelper.getWritableDatabase();

файл базы данных по-прежнему не существует. Теперь, когда я убиваю приложение из отладчика, я внезапно вижу созданный файл базы данных (с именем в iDbFileName). Метод onCreate OpenHelper никогда не вызывается.

Поэтому, хотя я согласен с тем, что цель метода onCreate, по-видимому, состоит в том, чтобы вызываться, когда файл базы данных не существует, и вызывается либо getReadableDatabase(), либо getWritableDatabase(), но это, по-видимому, не всегда так.

person user1639713    schedule 28.03.2013

Удаление приложения удалит базу данных и, таким образом, вызовет onCreate при следующем запуске.

person SuperNova1054    schedule 01.07.2013