Reputation: 1253
I am having trouble with a simple file to create a sqlite db. I am logging some messages that I was expecting to show in the logs if the database is created or upgraded but they are not showing.
Here is the code:
package com.example.karim.myandoidapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class HomeActivity extends AppCompatActivity {
String msg = "My android app log : ";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e(msg, "onCreate() event loading activity_home view");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Log.e(msg, "onCreate() event loading activity_home view");
Context context = myandoidapp.getAppContext();
MySQLiteHelper MySQLiteHelper = new MySQLiteHelper(context);
}
private class MySQLiteHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "mydbnamesss";
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("DEBUG: ", "db created at " + db.getPath());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("DEBUG: ", "db upgraded ");
}
}
}
Here is the output that I have in my logs:
06-14 15:02:29.122 6644-6644/com.example.karim.myandoidapp E/My android app log :: Opening HomeActivity
--------- beginning of system
06-14 15:02:29.141 6644-6644/com.example.karim.myandoidapp E/My android app log :: onCreate() event loading activity_home view
06-14 15:02:29.203 6644-6673/com.example.karim.myandoidapp D/EGL_emulation: eglMakeCurrent: 0xa22050c0: ver 3 0 (tinfo 0xa2203360)
06-14 15:02:29.209 6644-6673/com.example.karim.myandoidapp D/EGL_emulation: eglMakeCurrent: 0xa22050c0: ver 3 0 (tinfo 0xa2203360)
06-14 15:02:29.216 6644-6673/com.example.karim.myandoidapp D/EGL_emulation: eglMakeCurrent: 0xa22050c0: ver 3 0 (tinfo 0xa2203360)
06-14 15:02:29.218 6644-6673/com.example.karim.myandoidapp D/OpenGLRenderer: endAllActiveAnimators on 0x8eeae180 (RippleDrawable) with handle 0xa2203ac0
I am adding here how I am getting the context in case it is relevant:
package com.example.karim.myandoidapp;
import android.content.Context; import android.app.Application;
public class myandoidapp extends Application {
private static Context context;
public void onCreate() {
super.onCreate();
myandoidapp.context = getApplicationContext();
}
public static Context getAppContext() {
return myandoidapp.context;
}
}
Thanks
Upvotes: 1
Views: 1246
Reputation: 10623
When you are getting this error in your Fragment. Then the reason is that:
Don't initialize the variable outside oncreateView() method. only initialize the variable inside the oncreateView() method.
public class SecondFragment extends Fragment
{
//MySQLiteHelper db =new MySQLiteHelper(getActivity()); do not initialize it here like this only declare it like below
MySQLiteHelper db ;
public SecondFragment(){}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
view = inflater.inflate(R.layout.fragment_second, container, false);
db =new MySQLiteHelper(getActivity()); //Initialize it here only
}
}
Upvotes: 0
Reputation: 56938
The onCreate
method will only be called when an attempt is made to actually get/open the database. The simple fix would be to change :-
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
to
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.getWritableDatabase(); //<<<< this.getReadableDatabase could also be used.
}
If you want to always have a closed db, it could be better to use :-
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase mydb = this.getWritableDatabase();
mydb.close();
}
Then when you instantiate the Database Helper, using MySQLiteHelper MySQLiteHelper = new MySQLiteHelper(context);
. An attempt is made to open the database.
Note that the onCreate
method is only called once for the lifetime of the database, so you would only get the log messages the first time the database is opened (you could delete the App's data or uninstall the App and this would then result in onCreate
being called again).
The onUpgrade
method would only be called when the version number is increased and again not until an attempt is made to open/get the database.
Upvotes: 2
Reputation: 771
Your code defines a subclass of SQLiteOpenHelper
and then instantiates it, but that's not enough to create/open a SQLite database. If I were you, I'd read up on the new library by Google called Room. It's a fantastic library that helps you create and maintain SQLite databases with far less effort than manually creating your own instance of SQLiteOpenHelper
, maintaining migrations, etc...
Upvotes: 1