2015-03-30 2 views
2

Я столкнулся с ошибкой Foreign Key Constraint Failed (code 787), когда попытался обновить мою базу данных. Единственное изменение, которое я сделал, это попытаться добавить четвертую запись в мой InsertStatus. Я огляделся, и я прочитал, что использование ON DELETE CASCADE должно решить мою проблему, поэтому я попытался разместить его на всех своих ссылках на FK и попытался снова, но все тот же вопрос.SQLite External Key Constraint Failed (код 787)

Logcat указывает на мой onUpgrade и все DROP TABLES в нем (я попытался удалить его по одному, чтобы посмотреть, какие из них были плохими и, видимо, все они были).

Я использую ON DELETE CASCADE неправильно? Или это что-то еще в моем коде?

InsertStatus

void InsertStatus(SQLiteDatabase db) { 
    ContentValues cv = new ContentValues(); 
    cv.put(colStatusID, 0); 
    cv.put(colStatClass, "Active"); 
    db.insert(statTable, colStatusID, cv); 
    cv.put(colStatusID, 1); 
    cv.put(colStatClass, "Settled"); 
    db.insert(statTable, colStatusID, cv); 
    cv.put(colStatusID, 2); 
    cv.put(colStatClass, "Terminated"); 
    db.insert(statTable, colStatusID, cv); 
    cv.put(colStatusID, 3); 
    cv.put(colStatClass, ""); 
    db.insert(statTable, colStatusID, cv); 
} 

DatabaseHelper

db.execSQL("CREATE TABLE " + termsTable + " (" + colTermsID + " INTEGER PRIMARY KEY , " + colTermsClass + " TEXT)"); 

    db.execSQL("CREATE TABLE " + periodTable + " (" + colPeriodID + " INTEGER PRIMARY KEY , " + colPeriodClass + " TEXT)"); 

    db.execSQL("CREATE TABLE " + statTable + " (" + colStatusID + " INTEGER PRIMARY KEY , " + colStatClass + " TEXT)"); 

    db.execSQL("CREATE TABLE " + accountsTable + " (" + colID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      colName + " TEXT, " + 
      colAmount + " Integer, " + 
      colPurpose + " TEXT, " + 
      colTerms + " INTEGER NOT NULL, " + 
      colPeriod +" INTEGER NOT NULL, " + 
      colBalance +" INTEGER, "+ 
      colStatus + " INTEGER DEFAULT '1'," + 
      colDate + " TEXT, " + 
      colEditDate + " TEXT, " + 
      "FOREIGN KEY (" + colTerms + ") REFERENCES " + termsTable + " (" + colTermsID + ") ON DELETE CASCADE," + 
      "FOREIGN KEY (" + colPeriod + ") REFERENCES " + periodTable + " (" + colPeriodID + ") ON DELETE CASCADE," + 
      "FOREIGN KEY (" + colStatus + ") REFERENCES " + statTable + " (" + colStatusID + ") ON DELETE CASCADE);"); 

    db.execSQL("CREATE TABLE " + payTable + " (" + colPayID + " INTEGER PRIMARY KEY , " + 
      colGroupID + " INTEGER NOT NULL, " + 
      colPayBal + " TEXT, " + 
      colInterest + " TEXT, " + 
      colPayDue + " TEXT, " + 
      colDateDue + " TEXT, " + 
      colPaid + " Integer, " + 
      "FOREIGN KEY (" + colGroupID + ") REFERENCES " + accountsTable + " (" + colID + ") ON DELETE CASCADE);"); 

    db.execSQL("CREATE VIEW " + viewAccs + 
      " AS SELECT " + accountsTable + "." + colID + " AS _id," + 
      " " + accountsTable + "." + colName + "," + 
      " " + accountsTable + "." + colAmount + "," + 
      " " + accountsTable + "." + colPurpose + "," + 
      " " + termsTable + "." + colTermsClass + "," + 
      " " + periodTable + "." + colPeriodClass + "," + 
      " " + accountsTable+ "." + colBalance + "," + 
      " " + statTable + "." + colStatClass + "," + 
      " " + accountsTable + "." + colDate + "," + 
      " " + accountsTable + "." + colEditDate + "" + 
      " FROM " + accountsTable + 
      " JOIN " + termsTable + " ON " + accountsTable + "." + colTerms + " = " + termsTable + "." + colTermsID + 
      " JOIN " + periodTable + " ON " + accountsTable + "." + colPeriod + " = " + periodTable + "." + colPeriodID + 
      " JOIN " + statTable + " ON " + accountsTable + "." + colStatus + " = " + statTable + "." + colStatusID); 

    db.execSQL("CREATE VIEW " + viewPmnts + 
      " AS SELECT " + payTable + "." + colPayID + " AS _id," + 
      " " + accountsTable + "." + colID + "," + 
      " " + payTable + "." + colGroupID + "," + 
      " " + payTable + "." + colPayBal + "," + 
      " " + payTable + "." + colInterest + "," + 
      " " + payTable + "." + colPayDue + "," + 
      " " + payTable + "." + colDateDue + "," + 
      " " + payTable + "." + colPaid + "" + 
      " FROM " + payTable + 
      " JOIN " + accountsTable + " ON " + payTable + "." + colGroupID + " = " + accountsTable + "." + colID); 

    InsertTerms(db); 
    InsertPeriods(db); 
    InsertStatus(db); 
} 

onUpgrade

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 


    db.execSQL("DROP TABLE IF EXISTS " + accountsTable); 
    db.execSQL("DROP TABLE IF EXISTS " + termsTable); 
    db.execSQL("DROP TABLE IF EXISTS " + periodTable); 
    db.execSQL("DROP TABLE IF EXISTS " + statTable); 
    db.execSQL("DROP TABLE IF EXISTS " + payTable); 

    db.execSQL("DROP TRIGGER IF EXISTS acc_id_trigger"); 
    db.execSQL("DROP TRIGGER IF EXISTS acc_id_trigger22"); 
    db.execSQL("DROP TRIGGER IF EXISTS fk_accterm_termid"); 
    db.execSQL("DROP TRIGGER IF EXISTS fk_accperiod_periodid"); 
    db.execSQL("DROP TRIGGER IF EXISTS fk_accpay_payid"); 
    db.execSQL("DROP TRIGGER IF EXISTS fk_accstat_statid"); 

    db.execSQL("DROP VIEW IF EXISTS " + viewAccs); 
    db.execSQL("DROP VIEW IF EXISTS " + viewPmnts); 

    onCreate(db); 
} 
+0

вы пытались путем удаления приложения и повторите попытку после установки? – Keshav1234

+0

Да, все тот же результат. Код 787. Как же? Это не первый раз, когда я изменил содержимое «InsertStatus», и я никогда не сталкивался с этим раньше. – Cai

+0

Вы можете легко отслеживать ошибку, если вы используете отладчик, добавив точку останова. – Keshav1234

ответ

6

В соответствии с приведенной ниже Li пк вставить значение, которое не удалось ограничениями внешнего ключ означает, что вы добавили значение Foregin ключа, который не существует в родительской таблице

https://www.sqlite.org/foreignkeys.html

+0

Но все есть, я вытащил файл и загрузил его в DBBrowser, и все это есть. Я не вижу, чего не хватает. – Cai

+0

Можете ли вы выслать мне этот код? – cnnagpal

+0

Что значит код? Файл DB? – Cai

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