SQLiteOpenHelper.getWritableDatabase problem

11,355

A quick guess: change private SmartDBHelper dBHelper = new SmartDBHelper(this); to just private SmartDBHelper dBHelper; and only initialize the new object in onCreate().

Share:
11,355
prolink007
Author by

prolink007

I am a Computer Engineer. Things listed below are just a few things i am knowledgeable of: C/C++/C#, java, QT, Android, linux, Object Oriented, Assembly, computer architecture, MIPS, msp430, networking, html, php, css, mysql, sqlite, oracle, xsl, several interpreted languages

Updated on June 24, 2022

Comments

  • prolink007
    prolink007 almost 2 years

    EDIT: I believe i may have found the problem. I need to work on my SmartDBHelper class. Will do this and post the results here.

    EDIT: Found a link to someone who is having similar problem. Will be checking this to see if it fixes asap. Another Post

    EDIT: Updated to reflect some changes made suggested by some of the posters. Problem is still occurring.

    THE POST BELOW:

    My application need to be able to write to the sqlite3 database that is on the android from 2 different events. One of my events is writing to the database just fine. When the second event tries to write to the database the attached error occurs. I have no clue why this is happening or how to fix it. I have tried numerous things the past couple hours and googled a ton. Can someone please view the code i have below and let me know what you think?

    If you need any more information please let me know asap.

    Thanks in advance!

    //This is the sqliteopenhelper i created
    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
    
        }
    
    }  
    

    //This is the part that is working CORRECTLY
    public class DataNotificationSurvey extends Activity {
        private SmartDBHelper dBHelper;
        private Date timeStamp;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.datanotificationlayout);
            Log.v("datanotificationsurvey", "inside datanotificationsurvey");
    
                dBHelper = new SmartDBHelper(this);
            timeStamp = new Date(DataNotification.when);
            // XML code stuff left out here, was not needed
    
    
        }
    
        public void submitNotify(int tempType, Date tempDate) {
            SQLiteDatabase dBH = dBHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("userresponse", tempType);
            values.put("notifytime", (tempDate.getTime()/1000));
            dBH.insert("user_notify_data", null, values);
            dBH.close();
        }
    }  
    

    // This is the event that is NOT working correctly
    public class DataBuilder extends Activity {
        private List _listeners = new ArrayList();
        private SmartDataObject data;
        Context tThis;
        private SmartDBHelper dBHelper;
        private Date timeStampReference; //for keeping track of the first time
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("databuilder", "on create");
        dBHelper = new SmartDBHelper(this);
    }
    
        public void prepareData(SmartDataObject temp) {
            submitData(temp);
        }
    
        public void submitData(SmartDataObject temp) {
            data = temp;
            System.out.println("Where: DB-submitData");
            try {
            SQLiteDatabase dBH = dBHelper.getWritableDatabase(); // CODE FAILS AT THIS POINT
            Log.v("databuilder", "after writable");
            ContentValues values = new ContentValues();
            values.put("hr", data.getHeartRate());
            values.put("act", data.getAct());
            values.put("timestamp", data.getTimeStamp());
            dBH.insert("user_hr_data", null, values);
            Log.v("databuilder", "after insert");
            dBH.close();
            fireDataBuilderEvent(data);
            }
            catch(SQLException e) {
                e.printStackTrace();
            }
            catch(NullPointerException e) {
                e.printStackTrace();
            }
        }
        public synchronized void addDataBuilderListener(DataBuilderListener listener) {
            _listeners.add(listener);
        }
        public synchronized void removeDataBuilderListener(DataBuilderListener listener) {
            _listeners.remove(listener);
        }
        private synchronized void fireDataBuilderEvent(SmartDataObject temp) {
            DataBuilderEvent dRE = new DataBuilderEvent(this, temp);
            Iterator listeners = _listeners.iterator();
            while(listeners.hasNext()) {
                ((DataBuilderListener)listeners.next()).dataBuilderReceived(dRE);
            }
        }
        public interface DataBuilderListener {
            public void dataBuilderReceived(DataBuilderEvent event);
        }
    }   
    

    // The error that is occuring.
    03-13 17:38:40.130: INFO/System.out(279): Where: DB-submitData
    03-13 17:38:40.130: WARN/System.err(279): java.lang.NullPointerException
    03-13 17:38:40.151: WARN/System.err(279):     at cpe495.smartapp.DataBuilder.submitData(DataBuilder.java:41)
    03-13 17:38:40.151: WARN/System.err(279):     at cpe495.smartapp.DataBuilder.prepareData(DataBuilder.java:34)
    03-13 17:38:40.171: WARN/System.err(279):     at cpe495.smartapp.SmartApp$2.dataAnalyzedReceived(SmartApp.java:56)
    03-13 17:38:40.171: WARN/System.err(279):     at cpe495.smartapp.DataRobot.fireDataAnalyzedEvent(DataRobot.java:269)
    03-13 17:38:40.181: WARN/System.err(279):     at cpe495.smartapp.DataRobot.analyzeData(DataRobot.java:79)
    03-13 17:38:40.181: WARN/System.err(279):     at cpe495.smartapp.SmartApp$1.dataReceivedReceived(SmartApp.java:49)
    03-13 17:38:40.191: WARN/System.err(279):     at cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:79)
    03-13 17:38:40.201: WARN/System.err(279):     at cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:46)
    03-13 17:38:40.211: WARN/System.err(279):     at java.lang.Thread.run(Thread.java:1096)