Reputation: 43
I'm creating a timetable app, using an SQLite database and it was working fine, until i read an article on good coding practises. I had a DatabaseHelper file with over 1000+ lines of code due to including every create, read, update and delete statement in there. I went away and edited my code so that each table has a separate class for it's CRUD statements, but now it doesn't work. Everytime I run the app, it crashes and i get the error
invoke virtual method java.lang.list Database.SschoolDay_CRUD on a null object reference
(90% like that. I'm afraid I wont be able to get the specific error for at least 24 hours, but I can't access a pc with the permissions to run the app until tomorrow afternoon.)
I don't want to roll back to the hell of a 1000 line+ class. So, after some detective work, I've worked out the specific line where it is going wrong.
My DatabaseHelper
runs this method
SschoolDay_CRUD sschool_day;
List<SschoolDay_model_class> s;
public List<SschoolDay_model_class> getAllSSchoolDays() {
Log.v("Does it get here?", "YES");
s = sschool_day.getAllSSchoolDays();
Log.v("Does it get here?", "YES2");
return s;
}
I want this then to run the getAllSSchoolDays()
method within the SschoolDay_CRUD
class, which looks like this:
/*
* getting all SchoolDays
*/
public List<SschoolDay_model_class> getAllSSchoolDays() {
Log.v("Peep", "BEFORE");
List<SschoolDay_model_class> school_day = new ArrayList<SschoolDay_model_class>();
Log.v("Peep", "after");
String selectQuery = "SELECT * FROM " + DatabaseHelper.TABLE_SSCHOOL_DAY;
Log.e(DatabaseHelper.LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (c.moveToFirst()) {
do {
SschoolDay_model_class sdy = new SschoolDay_model_class();
sdy.setSchool_day_id(c.getInt((c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_ID))));
sdy.setSchool_day(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY)));
sdy.setUsed(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_USED)));
sdy.setNo_of_lessons(c.getInt(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS)));
// adding to SchoolDay list
school_day.add(sdy);
} while (c.moveToNext());
}
return school_day;
}
The log does not even display "BEFORE". Therefore it seems to be the
public List<SschoolDay_model_class> getAllSSchoolDays() {
For extra information, the class SschoolDay_model_class
looks like this:
package Database;
public class SschoolDay_model_class {
long school_day_id;
String school_day;
String used;
int no_of_lessons;
//constructors
public SschoolDay_model_class() {
}
public SschoolDay_model_class (long school_day_id, String school_day, String used, int no_of_lessons){
this.school_day_id = school_day_id;
this.school_day = school_day;
this.used = used;
this.no_of_lessons = no_of_lessons;
}
//setters
public void setSchool_day_id(long school_day_id){
this.school_day_id = school_day_id;
}
public void setSchool_day(String school_day){
this.school_day = school_day;
}
public void setUsed(String used) {
this.used = used;
}
public void setNo_of_lessons(int no_of_lessons){
this.no_of_lessons = no_of_lessons;
}
//getters
public long getSchool_day_id() {
return this.school_day_id;
}
public String getschool_day() {
return this.school_day;
}
public String getUsed() {
return this.used;
}
public int getNo_of_lessons() {
return this.no_of_lessons;
}
}
Edit: SschoolDay_CRUD class is this:
package Database;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class SschoolDay_CRUD extends SQLiteOpenHelper {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/*
* School Days will never be deleted, only set to used or not, which will determine their use.
* Therefore I have not written a delete statement for school day.
*/
/*
* Creating a School Day
*/
public long createSSchoolDay(SschoolDay_model_class school_day) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DatabaseHelper.KEY_SSCHOOL_DAY, school_day.getschool_day());
values.put(DatabaseHelper.KEY_SSCHOOL_DAY_USED, school_day.getUsed());
values.put(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS, school_day.getNo_of_lessons());
// insert row
long sschool_day_id = db.insert(DatabaseHelper.TABLE_SSCHOOL_DAY, null, values);
return sschool_day_id;
}
/*
* getting all SchoolDays
*/
public List<SschoolDay_model_class> getAllSSchoolDays() {
Log.v("Peep", "BEFORE");
List<SschoolDay_model_class> school_day = new ArrayList<SschoolDay_model_class>();
Log.v("Peep", "after");
String selectQuery = "SELECT * FROM " + DatabaseHelper.TABLE_SSCHOOL_DAY;
Log.e(DatabaseHelper.LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (c.moveToFirst()) {
do {
SschoolDay_model_class sdy = new SschoolDay_model_class();
sdy.setSchool_day_id(c.getInt((c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_ID))));
sdy.setSchool_day(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY)));
sdy.setUsed(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_USED)));
sdy.setNo_of_lessons(c.getInt(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS)));
// adding to SchoolDay list
school_day.add(sdy);
} while (c.moveToNext());
}
return school_day;
}
/*
* Updating a SchoolDay
*/
public int updatesSchoolDay(SschoolDay_model_class school_day) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DatabaseHelper.KEY_SSCHOOL_DAY, school_day.getschool_day());
values.put(DatabaseHelper.KEY_SSCHOOL_DAY_USED, school_day.getUsed());
values.put(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS, school_day.getNo_of_lessons());
// updating row
return db.update(DatabaseHelper.TABLE_SSCHOOL_DAY, values, DatabaseHelper.KEY_SSCHOOL_DAY_ID + " = ?",
new String[] { String.valueOf(school_day.getSchool_day_id()) });
}
@Override
public void onCreate(SQLiteDatabase db) {
// creating required tables
db.execSQL(DatabaseHelper.CREATE_TABLE_SSCHOOL_DAY);
db.execSQL(DatabaseHelper.CREATE_TABLE_SPERIODS);
db.execSQL(DatabaseHelper.CREATE_TABLE_SLESSON);
db.execSQL(DatabaseHelper.CREATE_TABLE_SHOMEWORK);
db.execSQL(DatabaseHelper.CREATE_TABLE_SEXAM);
db.execSQL(DatabaseHelper.CREATE_TABLE_SLESSON_TIME);
//creating revision tables
db.execSQL(DatabaseHelper.CREATE_TABLE_RREVISION_DAY);
db.execSQL(DatabaseHelper.CREATE_TABLE_RSESSION_PERIOD);
db.execSQL(DatabaseHelper.CREATE_TABLE_RSESSION);
db.execSQL(DatabaseHelper.CREATE_TABLE_RSESSION_TIME);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// on upgrade drop older tables
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SSCHOOL_DAY);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SPERIODS);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SLESSON);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SHOMEWORK);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SEXAM);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SLESSON_TIME);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RREVISION_DAY);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RSESSION_PERIOD);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RSESSION);
db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RSESSION_TIME);
// create new tables
onCreate(db);
}
public SschoolDay_CRUD(Context context) {
super(context, DatabaseHelper.DATABASE_NAME, null, DatabaseHelper.DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
}
EDIT: new error! (yay) now I'm getting ...considering rolling it back to the 1000+ line, at least that worked !!
03-13 12:32:24.416: E/AndroidRuntime(2374): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
because of this line :
SQLiteDatabase db = this.getReadableDatabase();
here is the constructor for the DatabaseHelper:
public Context DBHContext;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
DBHContext = context;
}
I then use DBHContext in the initialization of the SschoolDay_CRUD
SschoolDay_CRUD sschool_day = new SschoolDay_CRUD(DBHContext);
Upvotes: 1
Views: 1069
Reputation: 9870
From Your code it seems, that Your sschool_day
is not initialized at this time:
s = sschool_day.getAllSSchoolDays();
You have to initialize SschoolDay_CRUD sschool_day;
before calling getAllSSchoolDays();
Your initializing should look like this:
SschoolDay_CRUD sschool_day = new SschoolDay_CRUD(yourContext);
List<SschoolDay_model_class> s;
public List<SschoolDay_model_class> getAllSSchoolDays() {
Log.v("Does it get here?", "YES");
s = sschool_day.getAllSSchoolDays();
Log.v("Does it get here?", "YES2");
return s;
}
Upvotes: 1