Проблема SQLiteOpenHelper.getWritableDatabase - PullRequest
3 голосов
/ 08 марта 2011

РЕДАКТИРОВАТЬ: Я думаю, что я, возможно, нашел проблему.Мне нужно работать над моим классом SmartDBHelper.Сделаем это и опубликуем результаты здесь.

РЕДАКТИРОВАТЬ: Нашел ссылку на кого-то, у кого есть аналогичные проблемы.Будет проверять это, чтобы увидеть, если это исправить как можно скорее. Другой пост

РЕДАКТИРОВАТЬ: Обновлено, чтобы отразить некоторые изменения, предложенные некоторыми из постеров.Проблема по-прежнему возникает.

ПОСЛЕ НИЖЕ:

Моему приложению необходимо иметь возможность записи в базу данных 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

    }

}  

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

2 голосов
/ 08 марта 2011

Быстрое предположение: измените private SmartDBHelper dBHelper = new SmartDBHelper(this); на private SmartDBHelper dBHelper; и только инициализируйте новый объект в onCreate ().

0 голосов
/ 11 января 2015

У меня была эта проблема, и хотя я обычно никому не говорил, чтобы она специально что-то пропускала, это было единственное стабильное быстрое исправление, о котором я мог подумать.

Это исправило это для меня;

private static YourSQLiteOpenHelper helperAnchor;

И в onCreate

helperAnchor = this;

Так что, в основном, дайте объекту ссылку на себя, чтобы он оставался в живых, потому что в моем случае больше не было никого, чтобыразумно выразить это из-за вызова моей локальной базы данных из большого количества классов в ViewPager.Это связано с дополнительным недостатком необходимости создания другого метода, который снова устанавливает его в null, который вы должны вызывать везде, где хотите очистить его.

Но, эй, он просто работает.Приложение теперь очень стабильно, и до того, как оно завершится сбоем, SQLiteOpenHelper будет нулевым в случайные моменты времени.Пожалуйста, скажите мне, если / когда есть лучший способ сделать это, потому что, откровенно говоря, я тоже не люблю его использовать.

0 голосов
/ 08 марта 2011

использовать методы SQLiteDatabase для проверки состояния базы данных

isDbLockedByCurrentThread ()
isDbLockedByOtherThreads

Я думаю, что это заблокировано другим потоком. Или проверьте настройки вашего провайдера в Androidmanifest.xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...