1、報錯內容:
SQLiteException: Can't upgrade read-only database from version xx to yy:/data/data/com.xxx/databases/xxx.db at xxx.xxx.database.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:197) at com.xxx.dao省略。。。
引發操作:
前些天把對數據庫的查詢語句中獲取數據庫的方式由getWritableDatabase改成getReadableDatabase,導致後面升級數據庫的時候,getReadableDatabase修改沒權限升級。。。改回getWritableDatabase就好了
---------------------------------------------------------------------------------------------------------
2、報錯內容:
SQLiteException: table xxx already exists: create table xxx(xxx text, xxx text, xx text, primary key (xxx ,xxx )); at SQLiteDatabase.native_execSQL(Native Method) at SQLiteDatabase.execSQL(SQLiteDatabase.java:1835) at com.xxx.dao.xxxDBOpenHelper.onCreate(xxxDBOpenHelper.java:45) at com.xxx.dao.xxxDBOpenHelper.onUpgrade(xxxDBOpenHelper.java:58) at SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:123) at 省略。。。
引發操作:
原數據庫保存有兩張表,改動了其中一張表的結構/字段,在升級數據庫的時候,xxxDBOpenHelper.onUpgrade方法沒有一起刪掉兩張表。。。
3、報錯內容:
SQLiteMisuseException: library routine called out of sequence:
引發操作:
官方有如下幾種解釋:
1.調用API所用到的指針,第一種情況是沒有從sqlite3_open()或者是sqlite3_open16()獲得,第二種情況是sqlite3_open()函數已經將數據庫關閉了。
2. 兩個或者更多的線程同時訪問該數據庫。對於這樣的問題,可以通過加上鎖進行解決。
3. sqlite3_step()所用到的變量statement指針,第一種情況是該指針不是從sqlite3_prepare()或者是sqlite3_open16()獲得的,第二種情況是該指針已經被銷燬或者被釋放。這個和1中的情況是一樣的,不同的是使用這種指針的函數,兩者可以和爲一種情況。
4. 試圖將values綁定到一個正在運行的statement上。該解釋未遇到。
在我的工程裏面,應該是多線程操作數據庫導致的,算是以前的歷史遺留問題了,使用單例的方式操作數據庫即可,詳情看另一個博客如何在多線程操作數據庫
---------------------------------------------------------------------------------------------------------
4、報錯內容:
java.lang.IllegalArgumentException: the bind value at index 3 is null
引發操作:
原因是操作數據庫的時候,用到了where的操作,但是參數null造成的。StackOverflow上的回答:
http://stackoverflow.com/questions/9156528/giving-error-that-the-bind-value-at-index-4-is-null