4

From a fragment I instantiate this way

fmdata = new FileManagerData(getActivity());

the following class. I don't understand why onCreate() is not called and my database does not get created.

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: The trick is that the database has to be used (to read or write) so onCreate() get called.

2
  • 1
    Do you have to open/use DBHelper first? Commented Apr 13, 2012 at 20:41
  • this was the good tip, please mark it as an answer so I can accept it and upvote it Commented Apr 13, 2012 at 21:23

5 Answers 5

11

The onCreate method will be called after first access to the DB. Make a query to the DB and onCreate will be invoked.

Sign up to request clarification or add additional context in comments.

Comments

3

Probably the database exists from an earlier try.

Uninstall your app and try again.

Comments

0

You should put in onCreate this:

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

Where fieldOne and fieldTwo are names of your table's columns. Also look here: http://www.sqlite.org/datatype3.html

Comments

0

I know that this thread has already accepted answer. Neverthless this is what i have to add:

i have:

    protected class OpenHelper extends SQLiteOpenHelper {

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

I'm calling this:

    iOpenHelper = new OpenHelper(iDbFileName, DATABASE_VERSION );

The databese file doesn't exist at this stage.

Then i do some debugging of the app. i never call

    iOpenHelper.getReadableDatabase();

neither i call

    iOpenHelper.getWritableDatabase();

the database file still does not exist. Now when i kill the app from debugger i can suddenly see database file (with the name in iDbFileName) created. The onCreate method of the OpenHelper is never called.

So while i agree that the intention of onCreate method seems to be to get called when the database file doesn't exist and either getReadableDatabase() or getWritableDatabase() is called, this is apparently not always the case.

Comments

0

Uninstalling the app will remove the db, and thus will call onCreate on next run.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.