Я испытываю сбивающую с толку ошибку Базовых данных, в которой я получаю следующее сообщение об ошибке при попытке сохранить некоторые данные:
CoreData: error: (1) I/O error for database at /var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite. SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE'
Core Data: annotation: -executeRequest: encountered exception = I/O error for database at /var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite. SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE' with userInfo = {
NSFilePath = "/var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite";
NSSQLiteErrorDomain = 1;
}
Для некоторого контекста: в моей модели данных нет столбца «возвратный». У меня есть объект Cards, у которого есть атрибут relatedCards, представляющий собой отношение многие ко многим между элементами Card. Я совершенно сбит с толку относительно того, на что ссылается эта ошибка, и любая помощь будет принята с благодарностью.
UPDATE
Согласно замечательному предложению в комментариях, я запустил приложение в iOS Simulator с аргументом -com.apple.CoreData.SQLDebug 3
и получил следующий ответ:
CoreData: annotation: Connecting to sqlite database file at "/Users/jason/Library/Application Support/iPhone Simulator/5.0/Applications/4EE6D378-A946-4EBF-9849-F7D2E58F2776/Documents/Database.sqlite"
CoreData: sql: pragma cache_size=200
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: UPDATE ZCARD SET ZDATEMODIFIED = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ?
CoreData: details: SQLite bind[0] = "338478797.092588"
CoreData: details: SQLite bind[1] = (int64)7
CoreData: details: SQLite bind[2] = (int64)119
CoreData: details: SQLite bind[3] = (int64)6
CoreData: sql: UPDATE ZCARD SET ZDATEMODIFIED = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ?
CoreData: details: SQLite bind[0] = "338478797.092577"
CoreData: details: SQLite bind[1] = (int64)7
CoreData: details: SQLite bind[2] = (int64)100
CoreData: details: SQLite bind[3] = (int64)6
CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0)
CoreData: annotation: Disconnecting from sqlite database due to an error.
CoreData: error: (1) I/O error for database at /Users/jason/Library/Application Support/iPhone Simulator/5.0/Applications/4EE6D378-A946-4EBF-9849-F7D2E58F2776/Documents/Database.sqlite. SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE'
[Switching to process 45402 thread 0x15503]
Для небольшого контекста я изменил таблицу карт, чтобы отслеживать, когда она изменяется. Это то, что происходит в верхней части вывода отладки. Однако ключевая строка в отладочном выводе явно четвертая снизу:
CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0)
Я зашел в свою базу данных SQLite и проверил, нет ли в этой таблице столбца FOK_REFLEXIVE
. Схема для этой таблицы:
CREATE TABLE Z_1RELATEDCARDS ( Z_1RELATEDCARDS INTEGER, REFLEXIVE INTEGER, PRIMARY KEY (Z_1RELATEDCARDS, REFLEXIVE) );
Ясно, что Core Data пытается вставить данные в несуществующее поле. Что мне с этим делать?
Обновление:
Это также проблема, о которой сообщили пользователи. Я не могу обновить свое приложение и просто говорю пользователям: «О, хорошо, вам нужно очистить хранилище данных и начать все сначала». К сожалению, это не очень хорошо пройдет, даже если бы это было причиной этой ошибки.