05-12 18:51:14.676: E/AndroidRuntime(22729): java.lang.IllegalStateException: database not open
05-12 18:51:14.676: E/AndroidRuntime(22729): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1526)
05-12 18:51:14.676: E/AndroidRuntime(22729): at com.ailk.db.NetDB.addNetAppFlow(NetDB.java:391)
05-12 18:51:14.676: E/AndroidRuntime(22729): at com.ailk.android.sjb.MySMSService.getAppTrafficList(MySMSService.java:458)
05-12 18:51:14.676: E/AndroidRuntime(22729): at com.ailk.android.sjb.MySMSService.recordFlow(MySMSService.java:138)
05-12 18:51:14.676: E/AndroidRuntime(22729): at com.ailk.android.sjb.MySMSService$3.run(MySMSService.java:122)
05-12 18:51:14.676: E/AndroidRuntime(22729): at java.lang.Thread.run(Thread.java:1019)
05-12 18:54:29.246: E/AndroidRuntime(27041): FATAL EXCEPTION: Thread-13
05-12 18:54:29.246: E/AndroidRuntime(27041): java.lang.NullPointerException
05-12 18:54:29.246: E/AndroidRuntime(27041): at com.ailk.android.sjb.MySMSService.getAppTrafficList(MySMSService.java:478)
05-12 18:54:29.246: E/AndroidRuntime(27041): at com.ailk.android.sjb.MySMSService.recordFlow(MySMSService.java:138)
05-12 18:54:29.246: E/AndroidRuntime(27041): at com.ailk.android.sjb.MySMSService$3.run(MySMSService.java:122)
05-12 18:54:29.246: E/AndroidRuntime(27041): at java.lang.Thread.run(Thread.java:1019)
05-12 18:58:17.796: E/AndroidRuntime(28654): FATAL EXCEPTION: Thread-16
05-12 18:58:17.796: E/AndroidRuntime(28654): java.lang.NullPointerException
05-12 18:58:17.796: E/AndroidRuntime(28654): at com.ailk.android.sjb.MySMSService.getAppTrafficList(MySMSService.java:478)
05-12 18:58:17.796: E/AndroidRuntime(28654): at com.ailk.android.sjb.MySMSService.recordFlow(MySMSService.java:138)
05-12 18:58:17.796: E/AndroidRuntime(28654): at com.ailk.android.sjb.MySMSService$3.run(MySMSService.java:122)
05-12 18:58:17.796: E/AndroidRuntime(28654): at java.lang.Thread.run(Thread.java:1019)
方法A{
SQLiteDatabase db =getReadableDatabase();
。。。
db.close();
}
錯誤做法:
方法B(){
SQLiteDatabase
db =getReadableDatabase();
調用方法A();
db.插入等操作報錯
}
正確做法:
方法B(){
調用方法A();
SQLiteDatabase db =getReadableDatabase();
db.插入等操作報錯
}
備忘:關閉了資料庫在使用就會報錯!
小知識點:
getReadableDatabase()並不是以唯讀方式開啟資料庫,而是先執行getWritableDatabase(),失敗的情況下才調用。
getWritableDatabase()和getReadableDatabase()方法都可以擷取一個用於操作資料庫的SQLiteDatabase執行個體。
但getWritableDatabase()方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,
getWritableDatabase()開啟資料庫就會出錯。getReadableDatabase()方法先以讀寫方式開啟資料庫,
倘若使用如果資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以唯讀方式開啟資料庫。