2012-11-01 69 views
0
11-01 18:20:09.953: E/AndroidRuntime(528): FATAL EXCEPTION: main 
11-01 18:20:09.953: E/AndroidRuntime(528): java.lang.IllegalStateException: database not open 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1526) 
11-01 18:20:09.953: E/AndroidRuntime(528): at phoenix.metro.uis.DBHelper.insertCart(DBHelper.java:149) 
11-01 18:20:09.953: E/AndroidRuntime(528): at phoenix.metro.uis.SearchActivity$4.onClick(SearchActivity.java:171) 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.view.View.performClick(View.java:2485) 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.view.View$PerformClick.run(View.java:9080) 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.os.Handler.handleCallback(Handler.java:587) 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.os.Looper.loop(Looper.java:123) 
11-01 18:20:09.953: E/AndroidRuntime(528): at android.app.ActivityThread.main(ActivityThread.java:3683) 
11-01 18:20:09.953: E/AndroidRuntime(528): at java.lang.reflect.Method.invokeNative(Native Method) 
11-01 18:20:09.953: E/AndroidRuntime(528): at java.lang.reflect.Method.invoke(Method.java:507) 
11-01 18:20:09.953: E/AndroidRuntime(528): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
11-01 18:20:09.953: E/AndroidRuntime(528): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
11-01 18:20:09.953: E/AndroidRuntime(528): at dalvik.system.NativeStart.main(Native Method) 

數據庫的代碼如下:Android的SQLite數據庫無法打開的異常

public class DBHelper extends SQLiteOpenHelper{ 

    //SQLiteOpenHelper : A helper class to manage database creation and version management. 
    private final static String sdb_NAME="metro_sdb"; 
    private static int sdbVersion = 2; // version must be >=1 
    //Table name --------------------------------- 
    private final static String TABLE_NAME="Item"; 
    private final static String TABLE_NAME_CART="Cart"; 


    //Table columns (cart) ------------------------------ 
    private final static String COL_CART_ID="id"; 
    private final static String COL_CART_ADDDATE="name"; 
    public DBHelper(Context context) { 
     super(context, sdb_NAME, null, sdbVersion); // null is default for cursor factory 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db){ 
     //Called when the database is created for the first time. 

     String sql2 = "CREATE TABLE " + TABLE_NAME_CART +"("+ 
       COL_CART_ID +" TEXT,"+ 
       COL_CART_ADDDATE + " TEXT NOT NULL);"; 

     db.execSQL(sql2); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     //Called when the database needs to be upgraded. 
     String sql = "DROP TABLE IF EXISTS " + TABLE_NAME; 
     String sql2 = "DROP TABLE IF EXISTS " + TABLE_NAME_CART; 
     db.execSQL(sql); 
     db.execSQL(sql2); 
     onCreate(db); 
    } 

    public boolean insertCart(Cart cart){ 
     SQLiteDatabase sdb = getWritableDatabase(); 

     if(getCartItems(cart.id).size()>0){ 

      ContentValues values = new ContentValues(); 

      values.put(COL_ITEM_ID, cart.id); 
      values.put(COL_CART_ADDDATE, cart.addDate); 
      //long re = sdb.insert(TABLE_NAME_CART, null, values); 

      long re = sdb.insertWithOnConflict(TABLE_NAME_CART, null, values,SQLiteDatabase.CONFLICT_REPLACE); 
      sdb.close(); 

      return re > 0; 
     }else{ 
      sdb.close(); 
      return false; 
     } 
    } 

的錯誤是對數據庫的操作裏面insertCart()功能

+0

你試過'SQLiteDatabase sdb = this.getWriteableDatabase()'? –

+0

您的最低API是什麼? (我試圖通過源代碼。) – Sam

回答

1

你能嘗試刪除sdb.close()並重新進行檢查。

0

此錯誤的可能原因之一是您打開已打開的數據庫。

if (!sdb.isOpen()) { 
    System.out.println("If executed"); 
    sdb = getApplicationContext().openOrCreateDatabase(DATABASE_PATH, SQLiteDatabase.OPEN_READWRITE, null); 
} else { 
    System.out.println("Else executed"); 
} 

試試這個..,。

相關問題