Java SQLiteOpenHelper.getWritableDatabase问题

Java SQLiteOpenHelper.getWritableDatabase问题,java,android,sqlite,Java,Android,Sqlite,编辑:我相信我可能已经发现了问题。我需要学习SmartDBHelper类。我将这样做,并将结果发布在这里 编辑:找到有类似问题的人的链接。将对此进行检查,以查看是否尽快修复 编辑:更新以反映一些海报建议的一些更改。问题仍在发生 该职位如下: 我的应用程序需要能够从两个不同的事件写入android上的sqlite3数据库。我的一个事件就是向数据库写入数据。当第二个事件尝试写入数据库时,会发生附加错误。我不知道为什么会发生这种情况,也不知道如何解决。在过去的几个小时里,我尝试了很多东西,在谷歌上搜索

编辑:我相信我可能已经发现了问题。我需要学习SmartDBHelper类。我将这样做,并将结果发布在这里

编辑:找到有类似问题的人的链接。将对此进行检查,以查看是否尽快修复

编辑:更新以反映一些海报建议的一些更改。问题仍在发生

该职位如下:

我的应用程序需要能够从两个不同的事件写入android上的sqlite3数据库。我的一个事件就是向数据库写入数据。当第二个事件尝试写入数据库时,会发生附加错误。我不知道为什么会发生这种情况,也不知道如何解决。在过去的几个小时里,我尝试了很多东西,在谷歌上搜索了很多。有人能看看我下面的代码,让我知道你的想法吗

如果你需要更多的信息,请尽快告诉我

提前谢谢

//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

    }

}  




使用SQLiteDatabase的方法检查数据库状态

isDbLockedByCurrentThread()
IsDbYotherThreads阻塞

我想它被另一根线锁住了。
或者检查Androidmanifest.xml中的提供者设置。

快速猜测:更改
私有SmartDBHelper dBHelper=新建SmartDBHelper(此)
只需
私有SmartDBHelper并仅在onCreate()中初始化新对象。

我遇到了这个问题,虽然我通常不会告诉任何人故意泄漏任何东西,但这是我能想到的唯一稳定的快速修复方法

这为我解决了它

private静态YourSQLiteOpenHelper helperAnchor

再创造

helperAnchor=this

因此,基本上给对象一个自身引用以保持它的活动性,因为在我的例子中,由于从ViewPager中的大量类调用我的本地db,所以没有其他地方可以合理地放置它。这带来了另一个缺点,即必须创建另一个方法来再次将其设置为null,您必须在任何需要清理的地方调用它


但是,嘿,只是沃克斯。应用程序现在是超级稳定的,在此之前,它会在SQLiteOpenHelper上崩溃,而SQLiteOpenHelper在随机时间为null。请告诉我是否/何时有更好的方法,因为坦率地说,我也不喜欢使用它。

Edit:我不小心看到一个不正确的打字错误。我不知道为什么它不起作用,我的是以几乎相同的方式设置的。OP已经用下面海报提到的一些更改进行了更新。请就您看到的任何问题提出建议。ThanksI以前在访问数据库时,在陌生的地方遇到了NullPointerException。有时,当我在创建OpenHelper对象后没有立即访问它时,垃圾收集器似乎会将其丢弃(与游标相同,永远不要将游标作为参数从一个方法传递到另一个方法…NullPointerException。我不知道为什么会发生这种情况,但确实如此)。解决方法:在打开数据库之前,调用:if(myOpenHelper==null)myOpenHelper=newmyopenhelper(context);如果有其他方法来解决这个问题,我也想知道。如果它被另一个线程锁定,我如何解决这个问题?今晚我得检查一下这些方法。我只是想继续看看你是否有答案。如果你需要更多的解释空间,请编辑你的原始帖子。只需将其标记为您编辑的部分,并在此处发表评论,告诉我您已编辑。提前感谢。=)当我无法通过代码中的“SQLiteDatabase dBH=dBHelper.getwriteabledatabase();”时,如何对数据库进行这些调用。它在代码的这一点上给了我一个空指针异常。所以,我将无法在dBH上调用方法。对代码进行了一些修改,我在op中对其进行了更新。如果您有任何其他想法,请告诉我。我也遇到了同样的问题。。。有人能提出解决办法吗?我今晚会调查一下,看看会发生什么。谢天谢地,这不管用。为了确保我正确理解您的意思,您说的是哪个onCreate方法。在调用onCreate()之前,您不能使用对
this
的引用,所以请尝试修复这两个活动。我现在明白了。但是我在oncreate中没有oncreate方法,这里的建议是根据您所说的修改,这里是正在发生的错误。请告知。谢谢,更新反映在原始帖子中。
//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)