2011-03-23 61 views
0

我在这里有另一个类似于这个帖子,但是,我已经对我的类进行了一些更改,现在有一个不同的问题。前一个问题也从未解决。SQLiteOpenHelper空指针异常

我的应用程序需要能够从2个不同的事件写入android上的sqlite3数据库。我的一件事是写入数据库就好了。当第二个事件尝试写入数据库时​​发生附加错误。

我无法解决此问题。我已经看了一个多星期了。任何帮助是极大的赞赏。如果需要其他信息,请告诉我!只要我能解决这个问题,我就会发布我所拥有的一切,这会强调我。

The Error Logcat 
03-22 23:50:27.065: INFO/System.out(281): Where: DB-submitData 
03-22 23:50:30.846: WARN/System.err(281): java.lang.NullPointerException 
03-22 23:50:30.865: WARN/System.err(281):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
03-22 23:50:30.865: WARN/System.err(281):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
03-22 23:50:30.875: WARN/System.err(281):  at cpe495.smartapp.SmartDBHelper.open(SmartDBHelper.java:70) 
03-22 23:50:30.875: WARN/System.err(281):  at cpe495.smartapp.DataBuilder.submitData(DataBuilder.java:37) 
03-22 23:50:30.884: WARN/System.err(281):  at cpe495.smartapp.DataBuilder.prepareData(DataBuilder.java:29) 
03-22 23:50:30.904: WARN/System.err(281):  at cpe495.smartapp.SmartApp$2.dataAnalyzedReceived(SmartApp.java:56) 
03-22 23:50:30.904: WARN/System.err(281):  at cpe495.smartapp.DataRobot.fireDataAnalyzedEvent(DataRobot.java:269) 
03-22 23:50:30.916: WARN/System.err(281):  at cpe495.smartapp.DataRobot.analyzeData(DataRobot.java:79) 
03-22 23:50:30.925: WARN/System.err(281):  at cpe495.smartapp.SmartApp$1.dataReceivedReceived(SmartApp.java:49) 
03-22 23:50:30.935: WARN/System.err(281):  at cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:79) 
03-22 23:50:30.945: WARN/System.err(281):  at cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:46) 
03-22 23:50:30.945: WARN/System.err(281):  at java.lang.Thread.run(Thread.java:1096) 

//The main class SmartApp.java 
public class SmartApp extends Activity implements OnSharedPreferenceChangeListener { 
    TextView smartConnectionStatus; 
    TextView testOutputView; 
    Thread cThread; 
    private ConnectDevice cD = new ConnectDevice(); 
    private DataRobot dR = new DataRobot(this); 
    private DataBuilder dB = new DataBuilder(); 
    private DataSender dS = new DataSender(this); 

    Handler mHandler = new Handler(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.intro); 

     cD.addDataReceivedListener(new DataReceivedListener() { 
      @Override 
      public void dataReceivedReceived(DataReceivedEvent event) { 
       // TODO Auto-generated method stub 
       dR.analyzeData(event.getData()); 
      } 
     }); 
     dR.addDataAnalyzedListener(new DataAnalyzedListener() { 
      @Override 
      public void dataAnalyzedReceived(DataAnalyzedEvent event) { 
       // TODO Auto-generated method stub 
       dB.prepareData(event.getData()); 
      } 
     }); 
     dR.addDataAlertListener(new DataAlertListener() { 
      @Override 
      public void dataAlertReceived(DataAlertEvent event) { 
       Log.v("SmartApp", "data alert event caught"); 
       DataAlert a = new DataAlert(SmartApp.this); 
       mHandler.post(a); 
      } 
     }); 
     dR.addDataNotifyListener(new DataNotifyListener() { 
      @Override 
      public void dataNotifyReceived(DataNotifyEvent event) { 
       // TODO Auto-generated method stub 
       Log.v("SmartApp", "data notification event caught"); 
       DataNotification a = new DataNotification(SmartApp.this); 
       mHandler.post(a); 
      } 
     }); 
     dB.addDataBuilderListener(new DataBuilderListener() { 
      @Override 
      public void dataBuilderReceived(DataBuilderEvent event) { 
       // TODO Auto-generated method stub 
       dS.sendData(event.getData()); 
      } 
     }); 
    } 
    private Context getContext() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

//The DataBuilder.java class that fails to access the database 
public class DataBuilder extends Activity { 
    private List _listeners = new ArrayList(); 
    private SmartDataObject data; 
    SmartDBHelper sDBH = new SmartDBHelper(this); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v("databuilder", "on create"); 
    } 

    public void prepareData(SmartDataObject temp) { 
     submitData(temp); 
    } 

    public void submitData(SmartDataObject temp) { 
     data = temp; 
     System.out.println("Where: DB-submitData"); 
     try { 
      sDBH.open(); 
      sDBH.insertDataResponse(data.getHeartRate(), data.getAct(), data.getTimeStamp()); 
      sDBH.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 DataNotificationSurvey.java class that access the database successfully. 
public class DataNotificationSurvey extends Activity { 
    private Date timeStamp; 
    private Uri mUri; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.datanotificationlayout); 
     Log.v("datanotificationsurvey", "inside datanotificationsurvey"); 


     timeStamp = new Date(DataNotification.when); 

     TextView notifyDate = (TextView) findViewById(R.id.notifyDateTV); 
     notifyDate.setText(timeStamp.toLocaleString()); 
     final Button notifySubmitButton = (Button) findViewById(R.id.notifySubmitButton); 
     final RadioButton patientCrisisRB = (RadioButton) findViewById(R.id.patientCrisis); 
     final RadioButton physicalActivityRB = (RadioButton) findViewById(R.id.physicalActivity); 

     notifySubmitButton.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         if(patientCrisisRB.isChecked()) { 
          submitNotify(1, timeStamp); 
         } 
         else if(physicalActivityRB.isChecked()) { 
          submitNotify(2, timeStamp); 
         } 
         finish(); 
        } 
       }); 
    } 

    public void submitNotify(int tempType, Date tempDate) { 
     SmartDBHelper sDBH = new SmartDBHelper(this); 
     sDBH.open(); 
     sDBH.insertNotificationResponse(tempType, tempDate); 
     sDBH.close(); 
     /*ContentValues values = new ContentValues(); 
     values.put("userresponse", tempType); 
     values.put("notifytime", (tempDate.getTime()/1000)); 
     mUri = getContentResolver().insert(intent.getData(), values);*/ 
    } 
} 

//The SQLiteOpenHelper class, it extends this DatabaseHelper. 
public class SmartDBHelper extends Activity { 

    private DatabaseHelper dBH; 
    private SQLiteDatabase db; 
    private final Context mCtx; 

    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);"; 

    static class DatabaseHelper extends SQLiteOpenHelper { 

     DatabaseHelper(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 

     } 
    } 

    public SmartDBHelper(Context context) { 
     this.mCtx = context; 
    } 

    public SmartDBHelper open() throws SQLException { 
     dBH = new DatabaseHelper(mCtx); 
     db = dBH.getWritableDatabase(); 
     return this; 
    } 

    public void close() { 
     dBH.close(); 
    } 

    public long insertNotificationResponse(int tempType, Date tempDate) { 
     ContentValues values = new ContentValues(); 
     values.put("userresponse", tempType); 
     values.put("notifytime", (tempDate.getTime()/1000)); 
     return db.insert(NOTIFY_TABLE_NAME, null, values); 
    } 

    public long insertDataResponse(double tempAct, int tempHR, long tempDate) { 
     ContentValues values = new ContentValues(); 
     values.put("hr", tempHR); 
     values.put("act", tempAct); 
     values.put("timestamp", (tempDate/1000)); 
     return db.insert(HR_TABLE_NAME, null, values); 
    } 
} 
+1

不接受实际上不是答案的答案。你强迫人们阅读评论列表,发现其实并不是答案。 – Dave 2012-07-20 15:30:52

+1

投票结束。因为它太本地化,不会帮助未来的访问者。 – prolink007 2012-07-20 18:29:41

回答

2

这是一个老问题,但其接受的答案是错的,笔者不能删除整个事情,所以这里未来游客着想就是答案。

在DataBuilder中,您在传递Context之前已将其初始化为SmartDBHelper的构造函数。

SmartDBHelper sDBH = new SmartDBHelper(this); 

您必须等到onCreate()访问一个有效的上下文:

public class DataBuilder extends Activity { 
    private List _listeners = new ArrayList(); 
    private SmartDataObject data; 
    SmartDBHelper sDBH; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v("databuilder", "on create"); 
     sDBH = new SmartDBHelper(this); 
    } 

    // Rest of class 
} 

此外,我不相信DataBuilder或SmartDBHelper应该扩展活动。他们不使用任何活动的方法,并且无法通过致电new DataBulder()开始活动:

public class DataBuidler { 

public class SmartDBHelper { 
0

您DatabaseHelper类定义为静态的。这是造成所有问题的原因。当嵌套类被声明为静态它没有封闭类

更多详细信息的读取访问实例变量和方法Nested Class in Java

+0

当DatabaseHelper类不是静态的时,我得到相同的结果。我已经测试过,我改为静态,因为有人建议我在几天前尝试。 – prolink007 2011-03-23 14:53:18

+0

在这种情况下,我不确定。你可以在调用getWritableDatabase方法之前检查dBH是否为空 – Josnidhin 2011-03-24 03:45:27

+0

我已经测试过这个,每次我做出修改时都会说修复问题。上面列出的方式,在调用getWritableDatabase之前,dBH不为null。但是其他的实现它是空的。 – prolink007 2011-03-24 14:49:00

1

SQLiteOpenHelper.java:98是分贝= mContext.openOrCreateDatabase(MNA​​ME,0,mFactory );

让你在SQLiteOpenHelper设置一个空的上下文

+0

这就是对的。这是我的情况和在这里相同的问题:http://stackoverflow.com/questions/13183234/getwritabledatabase-throwing-null-pointer-exception – 2013-10-24 17:07:36