2016-04-21 62 views
0

我有我的數據庫工作,但我插入的所有記錄都是爲了檢查目的,現在我想刪除所有表並創建新的,所以我試圖通過更改數據庫更新版本。嘗試更新android中的sqlite數據庫時出錯

我沒有改變任何創建表查詢,但我得到一個外鍵約束失敗(代碼787)。

這裏是我DBHelper類:

private static final String DATABASE_NAME = "roomatesDB"; 
    // database version 
    private static final int DATABASE_VERSION = 3; 

    // tables name 
    public static final String APARTMENT_TABLE = "apartment"; 
    public static final String ROOMATE_TABLE = "roomate"; 
    public static final String SHOPCART_TABLE = "shopcart"; 
    public static final String ITEMS_TABLE = "items"; 

    // common column 
    public static final String APARTMENT_NUMBER_COLUMN = "apartmentNum"; 

    // roomates table columns 
    public static final String FIRST_NAME_COLUMN = "firstName"; 
    public static final String LAST_NAME_COLUMN = "lastName"; 
    public static final String PHONE_NUMBER_COLUMN = "phoneNumber"; 

    // shop cart table columns 
    public static final String NUMBER_COLUMN = "number"; 
    public static final String LIST_NAME_COLUMN = "name"; 

    // item table 
    public static final String PRICE_COLUMN = "price"; 
    public static final String ITEM_NAME_COLUMN = "name"; 

    // query for creating roomate table 
    public static final String CREATE_ROOMATE_TABLE = "CREATE TABLE " 
      + ROOMATE_TABLE + "(" + FIRST_NAME_COLUMN + " TEXT, " 
      + LAST_NAME_COLUMN + " TEXT, " + PHONE_NUMBER_COLUMN + " TEXT, " 
      + APARTMENT_NUMBER_COLUMN + " INTEGER, " 
      + "FOREIGN KEY(" + APARTMENT_NUMBER_COLUMN + ") REFERENCES " 
      + APARTMENT_TABLE + "(apartmentNum) " + ")"; 

    // query for crating shop cart table 
    public static final String CREATE_SHOPLIST_TABLE = "CREATE TABLE " 
      + SHOPCART_TABLE + "(" + NUMBER_COLUMN + " INTEGER PRIMARY KEY," 
      + LIST_NAME_COLUMN + " TEXT, " 
      + APARTMENT_NUMBER_COLUMN + " INTEGER, " 
      + "FOREIGN KEY(" + APARTMENT_NUMBER_COLUMN + ") REFERENCES " 
      + APARTMENT_TABLE + "(apartmentNum) " + ")"; 

    // query for creating shop item table 
    public static final String CREATE_SHOPITEM_TABLE = "CREATE TABLE " 
      + ITEMS_TABLE + "(" + ITEM_NAME_COLUMN + " TEXT," 
      + PRICE_COLUMN + " DOUBLE, " 
      + NUMBER_COLUMN + " INT, " 
      + "FOREIGN KEY(" + NUMBER_COLUMN + ") REFERENCES " 
      + SHOPCART_TABLE + "(number) " + ")"; 

    // query for creating apartment table 
    public static final String CREATE_APARTMENT_TABLE = "CREATE TABLE " 
      + APARTMENT_TABLE + "(" + APARTMENT_NUMBER_COLUMN + " INTEGER PRIMARY KEY" 
      + ")"; 


    public DBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    public void onConfigure(SQLiteDatabase db) { 
     super.onConfigure(db); 
     db.setForeignKeyConstraintsEnabled(true); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(CREATE_APARTMENT_TABLE); 
     db.execSQL(CREATE_ROOMATE_TABLE); 
     db.execSQL(CREATE_SHOPLIST_TABLE); 
     db.execSQL(CREATE_SHOPITEM_TABLE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + APARTMENT_TABLE); 
     db.execSQL("DROP TABLE IF EXISTS " + ROOMATE_TABLE); 
     db.execSQL("DROP TABLE IF EXISTS " + SHOPCART_TABLE); 
     db.execSQL("DROP TABLE IF EXISTS " + ITEMS_TABLE); 

     onCreate(db); 

    } 
+0

可以請你發佈你的logcat嗎? – Opiatefuchs

回答

2

documentation說:

如果外鍵約束啓用時,DROP TABLE命令執行從刪除表之前的隱式DELETE FROM指令數據庫模式。 [...]如果作爲DROP TABLE命令的一部分執行的隱式DELETE FROM違反了任何即時外鍵約束,則會返回錯誤並且不會刪除該表。

以正確的順序刪除數據,以便所有中間步驟都有效。或者只是禁用外部約束檢查(db.setForeignKeyConstraintsEnabled())。

+0

太棒了!謝謝 – ATT

相關問題