iOS — доступ к одной базе данных sqlite как из JavaScript, так и из FMDB

У нас есть проблема, которая появляется только на устройстве 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
  • Всякий раз, когда 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 приводят к следующей ошибке: «невозможно открыть транзакцию в базе данных»


person Ryan Pfeffer    schedule 22.08.2012    source источник


Ответы (1)


Здесь мы смогли добиться желаемого результата, откатив миграции в нашей базе данных sqlite до момента, предшествующего первой миграции, что фактически дало нам чистую базу данных. Мы также не удаляли ни один из файлов кеша, созданных веб-представлением. Это не лучшее решение в мире, но, похоже, оно работает для нашего варианта использования. Если есть какие-либо другие ответы, я хотел бы услышать о них больше.

person Ryan Pfeffer    schedule 21.09.2012