Problem with SQLiteOpenHelper.getWritableDatabase

EDIT: I believe that I might have found the problem. I need to work on the SmartDBHelper class. You will do this and post the results here.

EDIT: Found a link to someone who has a similar problem. This will be checked to see if it corrects as soon as possible. Another post

EDIT: Updated to reflect some changes made by some posters. The problem is still happening.

AFTER BELOW:

My application should be able to write to the sqlite3 database located on android from two different events. One of my events is just writing to the database. When the second event tries to write to the database, a related error occurs. I do not know why this is happening or how to fix it. I have tried many things in the last couple of hours and searched for a ton. Can someone please review the code I have and let me know what you think?

If you need more information, please let me know as soon as possible.

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)
+3
source share
3 answers

Quick guess: change private SmartDBHelper dBHelper = new SmartDBHelper(this);to private SmartDBHelper dBHelper;and just initialize a new object in onCreate ().

+1
source

SQLiteDatabase

isDbLockedByCurrentThread()
isDbLockedByOtherThreads

, . Androidmanifest.xml.

0

, , - -, , .

:

private static YourSQLiteOpenHelper helperAnchor;

onCreate

helperAnchor = this;

, , , - db ViewPager. , null, , .

But hey, it's just werks. The application is super stable now, where before, when it crashed on SQLiteOpenHelper it was zero at random. Please tell me if / when there is a better way to do this because, frankly, I also don’t like to do this.

0
source

All Articles