#iphone #sqlite
#iPhone #sqlite
Вопрос:
Я работаю над приложением базы данных, которое отлично работает в симуляторе (вставляет, обновляет, удаляет все функции правильно). Моя проблема начинается при попытке установить / запустить приложение на iPhone.
При первоначальном запуске программа создает редактируемую версию базы данных в каталоге documents приложения. Мой тест завершается неудачей, когда база данных не найдена в пакете приложений. База данных добавлена в папку Resources в XCode.
Код для проверки существующей версии базы данных (в сочетании с несколькими инструкциями NSLog) и для ее создания, если она еще не существует, выглядит следующим образом:
-(NSString *) createWriteableDatabase { BOOL DatabaseExists; ошибка NSError *;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *writeableDB = [documentsDir stringByAppendingPathComponent:@"flashCard.db"];
NSLog(@"writeableDB = '%@'.", writeableDB);
databaseExists = [fileManager fileExistsAtPath:writeableDB];
NSLog(@"databaseExists = %d.", databaseExists);
if (databaseExists)
return writeableDB;
//--- Writeable version of database does not exist -- copy from bundled software. ---
NSString *defaultPath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"flashCard.db"];
NSLog(@"defaultPath = '%@'.", defaultPath);
databaseExists = [fileManager fileExistsAtPath:defaultPath];
NSLog(@"databaseExists = %d.", databaseExists);
databaseExists = [fileManager copyItemAtPath:defaultPath toPath:writeableDB error:amp;error];
if (!databaseExists)
{
NSAssert1(0, @"Failed to create writeable database file: '%@'.", [error localizedDescription]);
return @"";
}
return writeableDB;
}
В отладчике отображаются следующие сообщения:
предупреждение: Не удается прочитать символы для /XCode 3.2.5/Platforms/iPhoneOS.platform/DeviceSupport /4.3.3 (8J2)/Symbols/System /Library/AccessibilityBundles/AccessibilitySettingsLoader.bundle/AccessibilitySettingsLoader (файл не найден). 2011-06-10 21:12:11.130 FlashEm[3768:707] writeableDB = ‘/var/mobile/Applications/9DBC50B5-2559-4E6A-BD21-B5B56D9DA18A/Documents/flashCard.db’. 2011-06-10 21:12:11.144 FlashEm [3768:707] DatabaseExists = 0. 2011-06-10 21:12:11.149 FlashEm[ 3768:707] defaultPath = ‘/var/mobile/Applications/9DBC50B5-2559-4E6A-BD21-B5B56D9DA18A/FlashEm.app/flashCard.db’. 2011-06-10 21:12:11.154 FlashEm[3768:707] DatabaseExists = 0. 2011-06-10 21:12:11.169 FlashEm[3768:707] * Ошибка утверждения в -[DBAccess createWriteableDatabase ], /Users/marathoner1234/Projects/FlashEm/Classes /../DBAccess.m:92 2011-06-10 21:12:11.201 FlashEm[3768:707] * Завершение работы приложения из-за неперехваченного исключения ‘NSInternalInconsistencyException’, причина: ‘Не удалось создать файл базы данных, доступный для записи: ‘Операция не может быть завершена. Нет такого файла или каталога’.’
Заранее спасибо за любую помощь, которую вы можете мне оказать, и я приношу извинения, если текст моего вопроса отформатирован неправильно — я впервые задаю вопрос на этом сайте.
(Я просмотрел два других вопроса, в которых возникала та же проблема, и проверил, применимы ли те же проблемы, что и в моей ситуации, но это не так.)
Комментарии:
1. Можете ли вы опубликовать фактическое имя файла базы данных, который находится в вашем пакете?
2. Вы отметили галочкой копию, когда сохраняли файл базы данных в своем проекте. Проверьте это также. Не удается найти базу данных на устройстве, потому что она не получает базу данных. На симуляторе оно работает нормально, поскольку там есть ссылка. Вы также можете проверить наличие других проблем. Это всего лишь моя идея
3. Имя файла, показанного в папке ресурсов, — flashcard.db. Файл был добавлен после проверки «Копировать элементы в папку целевой группы (при необходимости)». С тех пор я удалил файл и повторно скопировал его, но безрезультатно.
Ответ №1:
в вашем отчете о сбое говорится, что файл базы данных не найден в вашем каталоге документов. Это произойдет, только если вы неправильно установите файл базы данных в свою папку ресурсов, то есть внутри вашего пакета, поэтому программа на устройстве iphone не сможет прочитать ваш файл базы данных.
Комментарии:
1. Как я упоминал выше, база данных была добавлена в папку Resources в XCode. В противном случае оно также не будет работать должным образом в симуляторе.
2. Мне пока не разрешено отвечать на мой собственный вопрос, но я обнаружил свою ошибку: вопиющая ошибка с моей стороны — если бы это была гремучая змея, она бы укусила меня давным-давно. Имя файла, указанное в коде, — flashCard.db (в верхнем регистре ‘C’); имя файла в папке ресурсов — flashcard.db (в нижнем регистре ‘c’). Изменено имя файла в коде, проблема решена. Спасибо всем, кто добавил комментарии.