6

我们遇到的问题似乎只出现在 iOS 设备上,但在模拟器上似乎运行良好。这就是问题所在...

  • 我们的 iOS 应用程序是 Hybrid (Cordova),其中一些视图完全是原生的,而另一些则完全是 Web 的。
  • 我们想在两个代码库中使用相同的 sqlite db。
  • 在 Web 中,我们使用 WebSQL api(不是 Cordova 插件),在本机 iOS 端,我们使用 FMDB。
  • 该数据库最初是从 javascript 创建的,并放置在 App 的 Library Directory 中
    • 4.x 目录 <AppDir>/Library/WebKit/Databases/file__0/0000000000000001.db
    • 5.x 目录 <AppDir>/Library/Caches/file__0/0000000000000001.db
  • 每当 FMDB 访问 sqlite 数据库时,JS 代码就不能再针对它创建的数据库运行事务。

虽然还有其他类似的 SO 问题,但我还没有看到 Web 和本地都可以访问数据库的问题。根据我到目前为止所做的研究,这似乎是一个仅出现在设备上的沙盒问题。这是我们用来打开数据库的代码。

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端调用数据库会报如下错误:“unable to open a transaction to the database”

4

1 回答 1

0

通过将我们的 sqlite 数据库上的迁移一直回滚到第一次迁移之前,我们能够在这里达到预期的结果,从而有效地为我们提供了一个干净的数据库。我们也没有删除 Web 视图创建的任何缓存文件。它不是世界上最好的解决方案,但它似乎适用于我们的用例。如果还有其他答案,我很想听到更多关于它们的信息。

于 2012-09-21T20:47:46.553 回答