2016-04-21 3 views
0

У меня работала моя база данных, но все записи, которые я вставил, предназначались для проверки, теперь я хотел удалить все таблицы и создать новые, поэтому я попробовал обновить базу данных, изменив версия.Ошибка при попытке обновить базу данных sqlite в android

Я ничего не менял при создании табличных запросов, но у меня получилось ограничение внешнего ключа (код 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

Не могли бы вы предоставить вам свой логарифм? – Opiatefuchs

ответ

2

documentation говорит:

Если ограничения внешнего ключа включены, команда DROP TABLE выполняет неявную DELETE FROM команды перед удалением таблицы из схема базы данных. [...] Если неявный DELETE FROM, выполняемый как часть команды DROP TABLE, нарушает любые непосредственные ограничения внешнего ключа, возвращается ошибка, и таблица не отбрасывается.

Извлеките данные в правильном порядке, чтобы все промежуточные шаги были действительными. Или просто отключите проверку внешних ограничений (db.setForeignKeyConstraintsEnabled()).

+0

большой !! Спасибо – ATT

Смежные вопросы