iOS デバイスでのみ表示されるように見える問題がありますが、シミュレーターでは問題なく動作するようです。これが問題です...
- 当社の iOS アプリはハイブリッド (Cordova) で、一部のビューは完全にネイティブであり、他のビューは完全に Web です。
- 両方のコードベースから同じ sqlite データベースを使用したいと考えています。
- Web では WebSQL API (cordova プラグインではありません) を使用し、ネイティブ iOS 側では FMDB を使用しています。
- データベースは最初に JavaScript から作成され、アプリのライブラリ ディレクトリに配置されます。
- 4.x ディレクトリ
<AppDir>/Library/WebKit/Databases/file__0/0000000000000001.db
- 5.x ディレクトリ
<AppDir>/Library/Caches/file__0/0000000000000001.db
- 4.x ディレクトリ
- FMDB が sqlite データベースにアクセスするたびに、JS コードは作成したデータベースに対してトランザクションを実行できなくなります。
他にも同様の SO の質問がありますが、Web とネイティブの両方が DB にアクセスする場所をまだ見ていません。これまでに行った調査に基づくと、これはデバイスにのみ現れるサンドボックスの問題のようです。データベースを開くために使用しているコードを次に示します。
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 側からデータベースを呼び出すと、「データベースへのトランザクションを開くことができません」というエラーが発生することに注意してください。