Reputation: 34554
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)
onCreate
method? 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());
}
}
Upvotes: 31
Views: 37789
Reputation: 5805
One reason SQLiteOpenHelper.onCreate() doesn't get called is because the database file already exists on the device.
If you go to View > Tool Windows > App Inspection
in Android Studio, you can go to Database Inspector
and see the SQLite files on the device.
In the case where onCreate is not being called because there's an existing database with that name already, you can change the database name in your app to something new. Then database file won't exist, and so onCreate will get called.
static class MyDatabaseHelper extends SQLiteOpenHelper {
private DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION); // A new DB_NAME here means onCreate() will get called.
mDatabaseHelper = this;
}
....
....
}
If the above DB_NAME
is something never used before, onCreate() should run, but if you're trying to re-use a name, it already exists, and onCreate() won't run.
I found the easiest thing to do is just keep making new DB_NAME
s as you're iterating through app development.
Upvotes: 0
Reputation: 733
oncreate() method is not a constructor and also Called when the database is created for the first time.So you have to call getWritableDatabase() or getReadableDatabase() for open or create to your database.
getReadableDatabase() :- Create and/or open a database.
getWritableDatabase() :- Create and/or open a database that will be used for reading and writing.
Upvotes: 2
Reputation: 57672
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
Upvotes: 70