У нас есть проблема, которая появляется только на устройстве iOS, но, кажется, отлично работает на симуляторе. Вот проблема...
- Наше iOS-приложение является гибридным (Cordova) с некоторыми полностью нативными представлениями и полностью веб-представлениями.
- мы хотели бы использовать одну и ту же базу данных sqlite из обеих кодовых баз.
- В Интернете мы используем API WebSQL (а не плагин Cordova), со стороны Native iOS мы используем FMDB.
- The database is initially created from javascript and is placed in the App's Library Directory
- 4.x Dir
<AppDir>/Library/WebKit/Databases/file__0/0000000000000001.db
- Каталог 5.x
<AppDir>/Library/Caches/file__0/0000000000000001.db
- 4.x Dir
- Всякий раз, когда FMDB обращается к базе данных sqlite, код JS больше не может выполнять транзакции в созданной базе данных.
Хотя есть и другие похожие вопросы SO, мне еще не приходилось видеть ни одного, в котором доступ к БД должен был осуществляться как через Интернет, так и через нативную систему. Основываясь на проведенных мной до сих пор исследованиях, кажется, это проблема песочницы, которая проявляется только на устройстве. Вот код, который мы используем для открытия базы данных.
NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask,
YES);
NSString *libraryDir = [libraryPaths objectAtIndex:0];
NSString *databasePath = [libraryDir
stringByAppendingPathComponent:@"WebKit/Databases/file__0/"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:databasePath]) {
databasePath = [libraryDir
stringByAppendingPathComponent:@"Caches/file__0/"];
}
NSString *databaseFile = [databasePath
stringByAppendingPathComponent:@"0000000000000001.db"];
if (!static_fmdb) {
static_fmdb = [FMDatabase databaseWithPath:databaseFile];
NSAssert(static_fmdb, @"Unable to open create FMDatabase");
}
if (![static_fmdb open]) {
NSLog(@"Error in %@: Failed to connect to database!\n",
NSStringFromSelector(_cmd));
}
Обратите внимание, что после запуска этого кода последующие обращения к базе данных со стороны JS приводят к следующей ошибке: «невозможно открыть транзакцию в базе данных»