2012-04-13 1 views
4

Из фрагмента я создаю экземпляр таким образом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() дозвонились.

+1

Вам нужно сначала открыть/использовать DBHelper? –

+0

Это был хороший совет, пожалуйста, пометьте его как ответ, чтобы я мог его принять и угадать. – znat

ответ

11

onCreate метод будет вызван после первого доступа к БД. Сделайте запрос к БД и вызывается 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

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

я есть:

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

databese файл не существует на данном этапе.

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

iOpenHelper.getReadableDatabase(); 

ни я не называю

iOpenHelper.getWritableDatabase(); 

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

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

0

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