6

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
  • 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 側からデータベースを呼び出すと、「データベースへのトランザクションを開くことができません」というエラーが発生することに注意してください。

4

1 に答える 1

0

ここでは、sqlite データベースの移行を最初の移行の前までロールバックすることで、望ましい結果を得ることができました。これにより、効果的にクリーンなデータベースが得られました。また、Web ビューによって作成されたキャッシュ ファイルも削除しませんでした。これは世界最高のソリューションではありませんが、私たちのユースケースではうまくいくようです。他の回答がある場合は、それらについて詳しくお聞きしたいと思います。

于 2012-09-21T20:47:46.553 に答える