Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLiteOpenHelper failing to call onCreate?

I am trying to create a local database on an android phone using sqlite.

I have a helper class, shown below, that is used to create the database and provide the "help".

I am wanting to create an object of this class in the main part of my code and it create the database and tables there as well.

The problem:

Whenever i create an object of the class, it does not seem to be calling the onCreate method in the helper. I thought this is supposed to happen. I thought that onCreate was basically a constructor for the class. (I believe i am wrong)

  • So, why is it not calling the onCreate method?
  • Or how do i get it to create the database and tables where i am creating the object of the class?
  • What would be a better way to do this, if this is not a good approach?

public class SmartDBHelper extends SQLiteOpenHelper {      private static final String DATABASE_NAME = "smart_lite_db.db";     private static final int DATABASE_VERSION = 2;     private static final String NOTIFY_TABLE_NAME = "user_notify_data";     private static final String HR_TABLE_NAME = "user_hr_data";     private static final String NOTIFY_TABLE_CREATE =          "CREATE TABLE " + NOTIFY_TABLE_NAME +          " (counter INTEGER PRIMARY KEY, " +          "userresponse INTEGER, " +          "notifytime INTEGER);";     private static final String DATA_TABLE_CREATE =          "CREATE TABLE " + HR_TABLE_NAME +         " (counter INTEGER PRIMARY KEY, " +         "hr INTEGER, " +         "act INTEGER, " +         "timestamp INTEGER);";            public SmartDBHelper(Context context) {         super(context, DATABASE_NAME, null, DATABASE_VERSION);         // TODO Auto-generated constructor stub     }       @Override     public void onCreate(SQLiteDatabase db) {         // TODO Auto-generated method stub         Log.v("smartdbhelper", "before creation");         db.execSQL(NOTIFY_TABLE_CREATE);         Log.v("smartdbhelper", "middle creation");         db.execSQL(DATA_TABLE_CREATE);         Log.v("smartdbhelper", "after creation");     }       @Override     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {         // TODO Auto-generated method stub      }  } 

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {    private SmartDBHelper dBHelper;    public void onCreate(Bundle savedInstanceState) {       //where i am wanting to create the database and tables       dBHelper = new SmartDBHelper(getContext());    } } 
like image 498
prolink007 Avatar asked Feb 17 '11 01:02

prolink007


People also ask

When onCreate is called?

The Activity lifecycle consists of 7 methods: onCreate() : When a user first opens an activity than the first method that gets called is called as onCreate. It acts the same as a constructor of a class, then when an activity is instantiated then onCreate gets called.

When SQLite onCreate called?

The first time this is called, the database will be opened and onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and/or onOpen(SQLiteDatabase) will be called." Once opened successfully, the database is cached, so you can call this method every time you need to write to the database.

What is SQLiteOpenHelper class in Android?

SQLiteOpenHelper class The android. database. sqlite. SQLiteOpenHelper class is used for database creation and version management. For performing any database operation, you have to provide the implementation of onCreate() and onUpgrade() methods of SQLiteOpenHelper class.


2 Answers

The onCreate is not a constructor for the database class. It is only called if you try to open a database that does not exist. To open/create the database you need to add a call to one of these methods:

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {    private SmartDBHelper dBHelper;    public void onCreate(Bundle savedInstanceState) {       //where i am wanting to create the database and tables       dBHelper = new SmartDBHelper(getContext());       // open to read and write       dBHelper.getWritableDatabase();       // or to read only       // dBHelper.getReadableDatabase();    } } 

It is a bit big but here is my DatabaseAdapter you can take a look at: http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java

like image 65
WarrenFaith Avatar answered Oct 03 '22 09:10

WarrenFaith


You have to call getWritableDatabase() or getReadableDatabase().

like image 35
gngr44 Avatar answered Oct 03 '22 09:10

gngr44